Python 字典(dict)
字典保存键值对:通过键快速访问值。键必须可哈希(通常为不可变类型,如 str、int、tuple(元素皆可哈希时));值可以是任意对象。字典可变;自 Python 3.7 起,官方语言规范保证 dict 保留插入顺序。
相关:列表、集合(键与集合元素都要求可哈希)、循环、collections 模块 中的 defaultdict 等。
创建字典
python
# 字面量
person = {"first": "John", "last": "Doe", "age": 28}
# dict() 构造(键需为合法标识符形式时用关键字参数)
person = dict(first="John", last="Doe", age=28)
# 先空字典再赋值
person = {}
person["first"] = "John"
person["last"] = "Doe"
person["age"] = 28字面量最常用;dict(a=1) 适合键名符合标识符规则的场景。
python
mixed = {
"string_key": "value",
42: "numeric key",
(1, 2): "tuple key",
"nested": {"another": "dict"},
}读取:[] 与 get
python
config = {"debug": True, "port": 8080}
print(config["debug"])
# print(config["missing"]) # KeyError
print(config.get("missing")) # None
print(config.get("missing", "default")) # 'default'd[key]:键不存在时抛出KeyError,适合「必须有这个键」。d.get(key[, default]):不存在时返回None或你给的默认值。
修改与合并
python
settings = {"theme": "dark", "lang": "en"}
settings["notifications"] = True
settings["theme"] = "light"
settings.update({"lang": "es", "timezone": "UTC"})
print(settings)update 可传入字典或可迭代的键值对;已存在的键会被覆盖。
Python 3.9+ 支持合并运算符:
python
defaults = {"color": "blue", "size": "medium"}
custom = {"size": "large", "material": "cotton"}
final = defaults | custom
# {'color': 'blue', 'size': 'large', 'material': 'cotton'}
merged = {**defaults, **custom} # 旧写法,仍常用
defaults |= custom # 原地合并到 defaults右侧(或后面的字典)中的键覆盖左侧。
删除
python
data = {"a": 1, "b": 2, "c": 3}
v = data.pop("a") # 删除并返回值
v = data.pop("missing", "not found") # 无此键时返回默认值
del data["b"]
# Python 3.7+:按「后进先出」顺序弹出项(与插入顺序一致)
item = data.popitem()
data.clear() # {}遍历
python
scores = {"alice": 95, "bob": 87, "charlie": 92}
for name in scores: # 默认遍历键
print(name)
for score in scores.values():
print(score)
for name, score in scores.items():
print(f"{name}: {score}")需要键值时优先 items()。key in d 即可,不必写 key in d.keys()(多一次方法调用、语义等价)。
键是否存在
python
user = {"name": "Alice", "email": "alice@example.com"}
if "name" in user:
print("有 name 键")
email = user.get("email", "no-email@example.com")常用方法
python
data = {"x": 10, "y": 20}
list(data.keys()) # 视图对象,可迭代
list(data.values())
list(data.items())
# 若键不存在则写入默认值,存在则不变
data.setdefault("z", 30)
data.setdefault("x", 99)setdefault 适合「没有就建一个」的计数、分组等场景。
字典推导式
python
numbers = [1, 2, 3, 4, 5]
squares = {n: n**2 for n in numbers}
evens = {n: n**2 for n in numbers if n % 2 == 0}
prices = {"apple": 1.2, "banana": 0.5}
rounded = {k: round(v) for k, v in prices.items()}性能简述
字典底层为哈希表,查找、插入、删除平均 O(1)(极端哈希冲突下可能变差)。因此适合映射、缓存、计数等。
小结
| 操作 | 常见写法 |
|---|---|
| 读(必存在) | d[k] |
| 读(可缺) | d.get(k, default) |
| 写 / 改 | d[k] = v、update、| / |=(3.9+) |
| 删 | pop、del、popitem、clear |
| 遍历 | items()、keys()、values() |