Python3 字典

Ordered since 3.7, O(1) lookup, safe access patterns, merging, and dict comprehensions.

Beginner
Key PointsDict lookup is O(1) on hashable keys; `d[k]` raises KeyError, `d.get(k)` returns a default — pick deliberately.

Create and Access

Python
user = {"id": 1, "name": "alice", "roles": ["admin"]}
user["name"]           # 'alice'
user.get("age")        # None,不抛异常
user.get("age", 0)     # 0,带默认值

# user["age"]          -> KeyError

if "email" in user:    # 成员判断查的是键,不是值
    ...

Insert, Update, Delete

Python
d = {}
d["a"] = 1
d.update({"b": 2, "c": 3})     # 批量合并,覆盖同名键
del d["a"]
removed = d.pop("b", None)     # 带默认值,缺失不报错
d.setdefault("hits", 0)        # 不存在才写入
d["hits"] += 1

Counting with setdefault / Counter

Python
words = ["a", "b", "a", "c", "a"]

counts = {}
for w in words:
    counts[w] = counts.get(w, 0) + 1

from collections import Counter, defaultdict

print(Counter(words))              # Counter({'a': 3, 'b': 1, 'c': 1})
print(Counter(words).most_common(1))  # [('a', 3)]

groups = defaultdict(list)
for w in words:
    groups[w[0]].append(w)         # 无需先判断键是否存在

Iterating

PatternYields
for k in dKeys
for k in d.keys()Keys (explicit)
for v in d.values()Values
for k, v in d.items()Pairs
Python
for key, value in user.items():
    print(key, value)

# 按值排序输出
for name, score in sorted(scores.items(), key=lambda kv: -kv[1])[:3]:
    print(name, score)

Merging

Python
defaults = {"timeout": 5, "retries": 3}
override = {"timeout": 10}

merged = {**defaults, **override}        # {'timeout': 10, 'retries': 3}
merged2 = defaults | override            # 3.9+,同样的效果

# 原地合并
defaults |= override

Dict Comprehension

Python
prices = {"apple": 3, "pear": 5}
doubled = {k: v * 2 for k, v in prices.items()}
filtered = {k: v for k, v in prices.items() if v > 3}
inverted = {v: k for k, v in prices.items()}   # 值必须唯一,否则后写覆盖

# 元组列表转字典
rows = [("a", 1), ("b", 2)]
print(dict(rows))
Keys must be hashable — list, dict and set cannot be keys. Use a tuple, a string, or a frozen dataclass instead.

Friends & Partners