한양과학기술고등학교

에듀테크 프로젝트 대시보드

딕셔너리 (dict)

dict key-value get setdefault items

키→값 매핑. 3.7+ 부터 삽입 순서를 유지합니다. 키는 해시 가능해야 합니다.

1. 생성·접근

d = {"name": "김", "age": 20}
d = dict(name="김", age=20)
d = dict([("a", 1), ("b", 2)])
d = dict.fromkeys(["a", "b"], 0)   # => {'a': 0, 'b': 0}

d["name"]         # => '김'
# d["x"]          # KeyError
d.get("x")        # => None
d.get("x", 0)     # => 0  (기본값)

2. 수정·삭제

d = {"a": 1}
d["b"] = 2               # 추가
d["a"] = 99              # 갱신
d.update({"c": 3, "a": 0})   # 여러 개
merged = {**d1, **d2}    # 병합 (뒤가 우선)
d3 = d1 | d2             # 3.9+

d.pop("a")              # 제거하고 값 반환
d.pop("x", None)        # 없어도 안전
del d["b"]
d.setdefault("cnt", 0)  # 없으면 넣고, 있으면 기존 값 반환

3. 순회

d = {"a": 1, "b": 2}
for k in d:              # 키
    ...
for k, v in d.items():   # 키·값
    ...
for v in d.values():
    ...

list(d.keys())    # => ['a', 'b']
"a" in d          # => True  (키 검사)
len(d)            # => 2

4. 집계 관용구

# 개수 세기
counts = {}
for ch in "banana":
    counts[ch] = counts.get(ch, 0) + 1
# => {'b': 1, 'a': 3, 'n': 2}

# 그룹핑
groups = {}
for word in ["apple", "avocado", "banana"]:
    groups.setdefault(word[0], []).append(word)

# 더 간단하게는 collections.Counter / defaultdict

5. 뷰 객체

.keys() / .values() / .items() 는 동적 뷰
  • 리스트 사본이 아니라 원본을 비추는 창 — dict 가 바뀌면 뷰도 바뀜
  • .keys() 와 .items() 는 집합처럼 & | - 연산 가능
  • 순회 중 dict 크기를 바꾸면 RuntimeError → list(d) 로 복사 후 순회

6. 중첩·정렬

users = {"kim": {"age": 20}, "lee": {"age": 25}}
users["kim"]["age"]      # => 20

scores = {"a": 3, "b": 1, "c": 2}
sorted(scores.items(), key=lambda kv: kv[1])   # 값 기준 정렬
# => [('b', 1), ('c', 2), ('a', 3)]
max(scores, key=scores.get)   # => 'a'  (값이 최대인 키)
"There should be one — and preferably only one — obvious way to do it"