딕셔너리
리스트는 위치로 항목을 찾을 수 있게 해줍니다. 하지만 종종 이름으로 무언가를 찾고 싶을 때가 있습니다. "3번 항목을 줘"가 아니라 "민준의 점수를 줘"처럼요. 딕셔너리는 데이터를 키-값 쌍으로 저장합니다: 위치가 아닌 키로 값을 찾습니다.
딕셔너리 생성하기
각 키와 값 사이에 콜론을 두고, 쌍 사이에 콤마를 두는 중괄호 구문을 사용합니다. 키는 거의 항상 문자열입니다. 값은 숫자, 문자열, 다른 리스트, 심지어 다른 딕셔너리 등 무엇이든 될 수 있습니다.
player = {
"name": "민준",
"score": 87,
"level": 5,
"alive": True,
}값 접근하기
키를 대괄호와 함께 사용하여 값을 얻습니다. 키가 존재하지 않으면 Python은 KeyError를 발생시킵니다. 키가 있는지 확실하지 않을 때는 .get()을 사용하세요: 충돌 대신 None이나 지정한 기본값을 반환합니다.
player = {"name": "민준", "score": 87}
player["name"] # "민준"
player["score"] # 87
player["lives"] # KeyError (key doesn't exist)player.get("score") # 87
player.get("lives") # None (no error, returns None by default)
player.get("lives", 3) # 3 (use this default if key is absent)키가 누락될 가능성이 있을 때마다 .get()이 더 안전합니다:
count = inventory.get("arrows", 0) # 0 if "arrows" isn't in the dict추가 및 업데이트
대괄호로 키에 할당합니다. 키가 이미 존재하면 값이 교체됩니다. 아직 존재하지 않으면 새 항목이 생성됩니다. 전체 다른 딕셔너리를 한 번에 병합하려면 .update()를 사용하세요.
player = {"name": "민준", "score": 87}
player["score"] = 92 # update existing
player["level"] = 5 # add new keyextras = {"level": 5, "alive": True}
player.update(extras) # adds/overwrites with keys from extras항목 제거하기
항목을 제거하는 네 가지 방법이 있습니다. .pop()은 키를 제거하고 값을 반환합니다. 기본값과 함께 사용한 .pop()은 키가 없을 때도 안전합니다. del은 반환값 없이 키를 제거합니다. .clear()는 전체 딕셔너리를 비웁니다.
player = {"name": "민준", "score": 87, "level": 5}
player.pop("level") # removes "level" and returns 5
player.pop("lives", None) # safe pop, returns None if key absent
del player["score"] # removes "score", no return value
player.clear() # removes everything기본값을 사용한 .pop()은 존재하지 않을 수 있는 키를 제거하는 가장 안전한 방법입니다.
순회하기
세 가지 뷰를 통해 딕셔너리의 여러 부분을 순회할 수 있습니다. 딕셔너리 자체를 순회하면 키를 얻습니다. .values()는 값을 줍니다. .items()는 둘 다 한 번에 주며 가장 많이 사용하게 될 것입니다: 각 쌍을 두 이름으로 언패킹하여 깔끔하고 읽기 쉬운 루프를 만드세요.
player = {"name": "민준", "score": 87, "level": 5}
for key in player: # iterate keys (most common)
print(key)
for key in player.keys(): # same, explicit keys view
print(key)
for value in player.values(): # just the values
print(value)
for key, value in player.items(): # both, most useful
print(f"{key}: {value}").items()가 가장 많이 사용될 것입니다. 각 쌍을 두 이름으로 언패킹하면 루프가 읽기 쉬워집니다.
멤버십 검사하기
in은 딕셔너리에 키가 존재하는지 검사합니다. 값이 아닌 키만 검사합니다. 무언가가 없는지 확인하려면 not in을 사용하세요.
player = {"name": "민준", "score": 87}
"name" in player # True
"lives" in player # False
"lives" not in player # Truein은 키만 검사합니다. 값을 검사하려면 in player.values()를 사용하지만, 거의 필요하지 않습니다.
중첩 딕셔너리
값 자체가 딕셔너리일 수 있습니다. 이것은 여러 레벨을 가진 구조화된 데이터를 표현하는 방식입니다: 통계 섹션이 있는 플레이어, 하위 섹션이 있는 설정 파일 등. 두 쌍의 대괄호로 중첩된 값에 접근합니다: 첫 번째는 외부 키를 선택하고, 두 번째는 내부 키를 선택합니다.
users = {
"민준": {"score": 87, "level": 5},
"서연": {"score": 74, "level": 3},
}
users["민준"]["score"] # 87
users["서연"]["level"] # 3연쇄 대괄호로 접근합니다. 깊게 중첩된 구조의 경우 다루기 어려울 수 있으므로, 가능한 한 중첩을 얕게 유지하세요.
setdefault
.setdefault()는 키가 존재하면 읽고, 존재하지 않으면 기본값으로 설정한 다음 값을 반환합니다. 키가 존재해야 하지만 이미 있다면 덮어쓰지 않으려는 경우에 유용합니다.
inventory = {}
inventory.setdefault("arrows", 0) # sets "arrows": 0, returns 0
inventory.setdefault("arrows", 10) # "arrows" already exists, no change, returns 0키 존재 여부를 먼저 확인하지 않고 그룹화된 구조를 빌드하는 데 유용합니다:
groups = {}
for name, team in players:
groups.setdefault(team, []).append(name)collections.defaultdict 및 Counter
표준 라이브러리에는 일반적인 패턴을 자동으로 처리하는 두 개의 딕셔너리 하위 클래스가 있습니다. defaultdict는 누락된 키에 대한 기본값을 생성하므로 KeyError가 발생하지 않습니다. Counter는 시퀀스에서 각 항목이 얼마나 자주 나타나는지 세어 결과를 딕셔너리로 제공합니다.
collections import
defaultdict와 Counter는 표준 라이브러리에서 임포트해야 합니다. 임포트는 Modules 챕터에서 다룹니다.
from collections import defaultdict
groups = defaultdict(list)
for name, team in players:
groups[team].append(name) # no KeyError if team is newfrom collections import Counter
words = ["cat", "dog", "cat", "bird", "cat", "dog"]
counts = Counter(words)
# Counter({'cat': 3, 'dog': 2, 'bird': 1})
counts.most_common(2) # [('cat', 3), ('dog', 2)]Counter는 "루프에서 항목 세기" 보일러플레이트를 많이 절약해줍니다.
실전에서
점수 트래커를 빌드하고 모든 항목과 함께 요약을 출력하기:
scores = {"민준": 87, "서연": 92, "지호": 74, "하윤": 55}
total = sum(scores.values())
average = total / len(scores)
print(f"Players: {len(scores)}")
print(f"Average: {average:.1f}")
print(f"Highest: {max(scores.values())}")
print(f"Lowest: {min(scores.values())}")
print()
for name, score in scores.items():
print(f" {name}: {score}")
