본문으로 건너뛰기

딕셔너리 돌기

파이썬 목차딕셔너리와 집합레슨 33 / 59

목차

딕셔너리를 for로 돌면 키가 담은 차례대로 하나씩 나옵니다. 키와 값을 함께 꺼내려면 items()를 씁니다.

메뉴판의 메뉴를 모두 찍으려고 메뉴마다 print 줄을 하나씩 쓰면, 메뉴가 늘 때마다 줄도 더해야 합니다. for로 딕셔너리를 돌면 메뉴가 몇 개든 같은 두 줄로 끝납니다. 이때 하나씩 나오는 것이 키인지 값인지부터 알아야 합니다.

8단계 중 1단계. 다음을 누르면 1번 줄부터 실행합니다.

1for는 키를 하나씩 꺼낸다

리스트를 돌 때처럼 for는 하나씩 꺼내 그 값에 이름을 붙이고 덩어리를 한 번 실행합니다(규칙 4). 딕셔너리에서 꺼내는 것은 키입니다. 그림에서 x는 키 '커피'와 '라테'에 차례로 붙었고, 값 4000과 4500에는 붙지 않았습니다. 값이 필요하면 덩어리 안에서 키로 꺼냅니다. 아래 코드는 무엇을 찍을까요? 마지막 줄까지 글자 그대로 적어 본 뒤 펼쳐 보세요.

menu = {
    '커피': 4000,
    '라테': 4500,
    '녹차': 3500,
}
for x in menu:
    print(x, menu[x])
실행 결과 보기
실행 결과
커피 4000
라테 4500
녹차 3500

예상과 다르면 그곳이 배울 곳입니다. x는 키 '커피', '라테', '녹차'에 차례로 붙고, menu[x]가 그 키의 값을 꺼냅니다. 키는 담은 차례대로 나옵니다. 가나다 차례(녹차, 라테, 커피)로 나오지 않습니다.

2items()로 키와 값을 함께 꺼낸다

items()는 딕셔너리의 키와 값을 한 쌍씩 내줍니다. 한 쌍은 (키, 값) 꼴의 튜플입니다.

menu = {
    '커피': 4000,
    '라테': 4500,
}
for pair in menu.items():
    print(pair)
실행 결과
('커피', 4000)
('라테', 4500)

튜플은 풀어서 이름 여럿을 값에 하나씩 붙일 수 있습니다(튜플: 묶고 풀기). for 머리에 이름을 둘 쓰면, 꺼낸 쌍을 풀어 첫 이름을 키에, 둘째 이름을 값에 붙입니다.

menu = {
    '커피': 4000,
    '라테': 4500,
}
for name, price in menu.items():
    print(name, price)
실행 결과
커피 4000
라테 4500

첫 바퀴에 name은 '커피'에, price는 4000에 붙습니다. menu[name]으로 다시 꺼내지 않아도 값에 이름 price가 붙어 있습니다.

예제

메뉴판 찍기

f-문자열의 :,는 가격에 천 단위 쉼표를 찍습니다(f-문자열로 출력 꾸미기).

menu = {
    '커피': 4000,
    '라테': 4500,
    '녹차': 3500,
}
for name, price in menu.items():
    print(f'{name} {price:,}원')
실행 결과
커피 4,000원
라테 4,500원
녹차 3,500원

메뉴가 늘어도 6·7번 줄은 그대로입니다. 메뉴는 담은 차례대로 찍힙니다.

도는 중에 키를 더하면

menu = {'커피': 4000}
for x in menu:
    menu['쿠키'] = 2000
실행 결과
Traceback (most recent call last):  File "main.py", line 2, in <module>    for x in menu:             ^^^^RuntimeError: dictionary changed size during iteration

맨 아래 줄부터 읽습니다. RuntimeError는 다른 오류 이름에 들지 않을 때 붙는 이름이라, 무엇이 잘못됐는지는 콜론 뒤 설명이 말합니다. 여기서는 '도는 동안 딕셔너리의 크기가 바뀌었다'는 뜻입니다. 3번 줄이 키를 하나 더해 쌍이 늘었고, 2번 줄의 for가 다음 키를 꺼내려다 멈췄습니다. 오류는 2번 줄에서 났지만 고칠 곳은 3번 줄입니다. 키를 더하는 일은 반복 앞이나 뒤에서 합니다. 있는 키의 값만 바꾸는 것은 크기가 그대로라 오류가 나지 않습니다.

자주 틀리는 곳

틀린 생각: for로 딕셔너리를 돌면 값이 하나씩 나온다.

딕셔너리에서 쓸모 있는 것은 대개 가격 같은 값이라, 돌면 값이 나올 것처럼 보입니다. for가 꺼내는 것은 키입니다.

stock = {'우유': 3, '빵': 5}
for x in stock:
    print(x)
실행 결과
우유
빵

x는 키 '우유'와 '빵'에 붙어서, 개수 3과 5는 찍히지 않습니다.

맞는 규칙: for는 딕셔너리에서 키를 하나씩 꺼내 이름을 붙입니다. 값은 stock[x]처럼 키로 꺼내거나 items()로 키와 함께 꺼냅니다(규칙 4).

틀린 생각: 딕셔너리를 돌면 키가 가나다 차례로 나온다.

국어사전처럼 키가 가나다 차례로 정리되어 나올 것 같습니다. 딕셔너리는 키를 담은 차례를 지킵니다.

menu = {
    '커피': 4000,
    '라테': 4500,
    '녹차': 3500,
}
for x in menu:
    print(x)
실행 결과
커피
라테
녹차

1~5번 줄에 담은 차례 그대로 커피, 라테, 녹차가 나옵니다.

맞는 규칙: 딕셔너리는 키를 담은 차례대로 내줍니다. 가나다 차례가 필요하면 for x in sorted(menu):⁠처럼 키를 정렬한 새 리스트를 돕니다.

확인 문제

1. 1절 코드의 7번 줄을 print(menu[x])로 바꿨습니다. 무엇이 찍히는지 마지막 줄까지 글자 그대로 쓰세요.

menu = {
    '커피': 4000,
    '라테': 4500,
    '녹차': 3500,
}
for x in menu:
    print(menu[x])
힌트

6번 줄이 바퀴마다 x를 무엇에 붙이는지 먼저 적고, 7번 줄의 menu[x]가 무엇을 꺼내는지 봅니다.

정답

모두 3줄입니다.

실행 결과
4000
4500
3500

x는 키 '커피', '라테', '녹차'에 차례로 붙고, menu[x]는 그 키의 값을 꺼냅니다.

흔한 오답은 KeyError로 멈춘다고 쓰는 것입니다. x가 값 4000에 붙는다고 보면 menu[4000]을 찾는 것으로 읽힙니다. 딕셔너리를 돌면 값이 나온다고 본 것입니다. x는 키에 붙습니다.

2. 메뉴 가격을 모두 더해 8500을 찍으려 합니다. 2번 줄의 커피 값이 4000이 아니라 4500이면 9000이 찍혀야 합니다. 빈칸을 채우세요.

menu = {
    '커피': 4000,
    '라테': 4500,
}
total = 0
for x in menu:
    total = total + ________
print(total)
힌트

6번 줄이 이름 x를 무엇에 붙이는지 봅니다.

정답

menu[x]입니다.

menu = {
    '커피': 4000,
    '라테': 4500,
}
total = 0
for x in menu:
    total = total + menu[x]
print(total)
실행 결과
8500

x는 키에 붙으므로, 가격은 menu[x]로 꺼내 더합니다.

다르게 써도 되는 곳: menu.get(x)나 menu.get(x, 0)도 같습니다. 6번 줄을 items()로 키와 값을 함께 꺼내는 꼴로 바꿨다면, 빈칸에는 값에 붙인 이름을 씁니다.

흔한 오답은 x입니다. x가 가격에 붙는다고 본 것입니다. 수 0에 키 글자 '커피'를 더하려다 TypeError로 멈춥니다.

3. 공연장 좌석 번호와 앉은 사람을 딕셔너리에 적었습니다. 무엇이 찍히는지 마지막 줄까지 글자 그대로 쓰세요.

seats = {3: '민지', 5: '준호'}
for x in seats:
    print(x)
print(seats[5])
힌트

1번 줄에서 콜론 왼쪽에 있는 것이 키입니다. 4번 줄의 대괄호 안 5를 무엇으로 보는지 가립니다.

정답

모두 3줄입니다.

실행 결과
3
5
준호

키가 좌석 번호 3과 5라서 for가 3과 5를 차례로 꺼냅니다. 4번 줄의 seats[5]는 자리 번호 5(여섯째 칸)가 아니라 키 5의 값입니다.

흔한 오답은 첫 두 줄을 민지, 준호로 쓰는 것입니다. 딕셔너리를 돌면 값이 나온다고 본 것입니다.

for 줄 위에 menu['쿠키'] = 2000을 더 쓰면 찍히는 줄을 모두 봅니다.

처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로