Skip to content

Python 字典(dict

字典保存键值对:通过快速访问。键必须可哈希(通常为不可变类型,如 strinttuple(元素皆可哈希时));值可以是任意对象。字典可变;自 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] = vupdate| / |=(3.9+)
popdelpopitemclear
遍历items()keys()values()

参考