Python3 字典
Ordered since 3.7, O(1) lookup, safe access patterns, merging, and dict comprehensions.
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"] += 1Counting 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
| Pattern | Yields |
|---|---|
| for k in d | Keys |
| 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 |= overrideDict 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.
创建与访问
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: # 成员判断查的是键,不是值
...增改删
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用 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) # 无需先判断键是否存在遍历
| 写法 | 产出 |
|---|---|
| for k in d | 键 |
| for k in d.keys() | 键(显式) |
| for v in d.values() | 值 |
| for k, v in d.items() | 键值对 |
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)合并
Python
defaults = {"timeout": 5, "retries": 3}
override = {"timeout": 10}
merged = {**defaults, **override} # {'timeout': 10, 'retries': 3}
merged2 = defaults | override # 3.9+,同样的效果
# 原地合并
defaults |= override字典推导式
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))键必须可哈希 —— 列表、字典、集合不能当键。改用元组、字符串或 frozen dataclass。