字典方法
字典对象提供了一系列方法来安全访问、批量更新和灵活遍历数据。
get:安全访问
d.get(key[, default]) 在键存在时返回值,不存在时返回 default(默认 None):
tel = {'jack': 4098, 'sape': 4139}
print(tel.get('jack')) # 4098
print(tel.get('irv')) # None,不报错
print(tel.get('irv', 0)) # 0,自定义默认值
get 只读不写,而 d[key] 在键不存在时会创建新键(仅在赋值语境下)。
setdefault:获取或设置
d.setdefault(key[, default]) 在键存在时返回值,不存在时插入并返回 default:
tel = {'jack': 4098}
print(tel.setdefault('jack', 0)) # 4098,键存在,默认值被忽略
print(tel.setdefault('irv', 4127)) # 4127,键不存在,插入并返回
tel # {'jack': 4098, 'irv': 4127}
常用于分组统计:
data = [('a', 1), ('b', 2), ('a', 3)]
groups = {}
for key, val in data:
groups.setdefault(key, []).append(val)
print(groups) # {'a': [1, 3], 'b': [2]}
keys、values、items:动态视图
这三个方法分别返回字典键、值、键值对的视图对象。视图与字典动态绑定,修改后立即反映变化:
d = {'jack': 4098, 'sape': 4139}
keys = d.keys()
d['irv'] = 4127
print(keys) # dict_keys([...'irv'])
视图支持集合运算:d1.keys() & d2.keys() 返回共同键,d1.keys() | d2.keys() 返回全部键。values() 不支持集合运算。
update:批量更新
d.update([other]) 将另一个字典或键值对可迭代对象合并到当前字典。键冲突时,传入的值覆盖原有值:
d = {'jack': 4098, 'sape': 4139}
d.update({'guido': 4127, 'jack': 9999})
print(d) # {'jack': 9999, 'sape': 4139, 'guido': 4127}
也接受关键字参数和可迭代对象:d.update(irv=4127)、d.update(zip(['a','b'], [1,2]))。
Python 3.9+ 支持 | 合并运算符:d1 | d2 创建新字典,d1 |= d2 原地更新。
pop:删除并返回
d.pop(key[, default]) 删除指定键并返回值。键不存在时,有 default 则返回,否则抛出 KeyError:
d = {'jack': 4098, 'sape': 4139}
val = d.pop('jack') # val = 4098
val = d.pop('irv', 'N/A') # val = 'N/A',安全删除
clear 与 copy
clear() 移除所有键值对。copy() 返回浅拷贝:
d = {'a': [1, 2]}
d2 = d.copy()
d2['a'].append(3)
print(d['a']) # [1, 2, 3],内部列表共享
需要完全独立时,使用 copy.deepcopy(d)。
fromkeys:类方法创建
dict.fromkeys(seq[, value]) 用序列元素作为键,所有键共享同一个默认值:
d = dict.fromkeys(['a', 'b', 'c'], 0) # {'a': 0, 'b': 0, 'c': 0}
d = dict.fromkeys(['a', 'b']) # {'a': None, 'b': None}
注意:默认值是可变对象时,所有键共享同一引用:
d = dict.fromkeys(['a', 'b'], [])
d['a'].append(1)
print(d) # {'a': [1], 'b': [1]}
需要独立值时,使用字典推导式:{k: [] for k in ['a', 'b']}。