Python字典高效使用指南:8个实用技巧
本文整理了Python字典高效使用的8个技巧,涵盖检查键存在、安全获取值、设置默认值、初始化字典、列表转字典、模拟Switch语句、迭代优化及推导式应用。通过对比Python2与Python3的差异,帮助开发者编写更简洁、高性能的Pythonic代码。
字典(dict)是Python中最核心的数据结构之一。社区中常有一种说法:“Python试图用字典装载整个世界”,这充分说明了字典在Python生态中的重要地位。本文整理了一份高效使用字典的清单,旨在帮助开发者在日常应用中更合理地利用字典特性,从而写出更加符合Python风格(Pythonic)的代码。
1、使用 in 关键字检查键是否存在
Python之禅中有一条核心开发哲学:
应该有一种——最好只有一种——显而易见的方法来做这件事。
这意味着应优先寻找一种,最好是唯一的一种清晰解决方案。在Python 2中,判断键是否存在于字典中可以使用 has_key 方法,或者使用 in 关键字。但强烈推荐使用 in 关键字,原因有二:首先,in 的处理速度更快;其次,has_key 方法在Python 3中已被移除。若需同时兼容Python 2和Python 3的代码,使用 in 是最佳选择。
bad
d = {'name': 'python'}
if d.has_key('name'):
pass
good
if 'name' in d:
pass
2、使用 get 方法获取字典中的值
获取字典值的简单方式是通过 d[x] 访问元素,但当键不存在时会抛出 KeyError 错误。虽然可以先用 in 操作检查键是否存在再获取,但这不符合Python之禅中提到的:
简单优于复杂。 扁平优于嵌套。
优秀的代码应当简单易懂,结构扁平以提高可读性。我们可以使用 get 方法来替代繁琐的 if ... else 判断逻辑。
bad
d = {'name': 'python'}
if 'name' in d:
print(d['hello'])
else:
print('default')
good
print(d.get("name", "default"))
3、使用 setdefault 为不存在的键设置默认值
data = [
("animal", "bear"),
("animal", "duck"),
("plant", "cactus"),
("vehicle", "speed boat"),
("vehicle", "school bus")
]
在进行分类统计时,通常希望将同类数据归入字典的特定类型中。例如,将相同类型的事物以列表形式重新组装,生成新的字典结构。
groups = {}
>>>
{'plant': ['cactus'],
'animal': ['bear', 'duck'],
'vehicle': ['speed boat', 'school bus']}
常规做法是先判断键是否存在,若不存在则先用列表对象进行初始化,再执行后续操作。而更优雅的方式是使用字典的 setdefault 方法。
bad
for (key, value) in data:
if key in groups:
groups[key].append(value)
else:
groups[key] = [value]
good
groups = {}
for (key, value) in data:
groups.setdefault(key, []).append(value)
setdefault 的作用机制如下:
如果键已存在于字典中,直接返回对应的值,其效果等同于 get 方法。
如果键不存在于字典中,则使用 setdefault 的第二个参数作为该键的值,并返回该值。
4、使用 defaultdict 初始化字典对象
如果希望 d[x] 在键 x 不存在时不报错,除了在获取元素时使用 get 方法外,另一种方式是使用 collections 模块中的 defaultdict。在初始化字典时指定一个工厂函数,defaultdict 实际上是 dict 的子类。
from collections import defaultdict groups = defaultdict(list) for (key, value) in data: groups[key].append(value)
当键不存在于字典中时,list 函数将被调用并返回一个空列表,赋值给 d[key]。这样,你无需担心调用 d[k] 会引发错误。
5、使用 fromkeys 将列表转换为字典
keys = {'a', 'e', 'i', 'o', 'u' }
value = []
d = dict.fromkeys(keys, value)
print(d)
>>>
{'i': [], 'u': [], 'e': [],
'a': [], 'o': []}
6、使用字典实现 switch ... case 语句
Python中没有原生的 switch ... case 语句,Python之父Guido van Rossum曾明确表示,该语法过去没有,现在没有,未来也不会有。因为Python简洁的语法完全可以通过 if ... elif 实现。若分支判断过多,还可以使用字典来替代,使逻辑更清晰。
if arg == 0:
return 'zero'
elif arg == 1:
return 'one'
elif arg == 2:
return "two"
else:
return "nothing"
good
data = {
0: "zero",
1: "one",
2: "two",
}
data.get(arg, "nothing")
7、使用 iteritems 迭代字典中的元素
Python提供了多种迭代字典元素的方式,第一种是使用 items 方法:
d = {
0: "zero",
1: "one",
2: "two",
}
for k, v in d.items():
print(k, v)
items 方法返回由(key, value)组成的列表对象。这种方式在处理超大字典时存在弊端,因为列表对象会一次性将所有元素加载到内存,导致内存占用瞬间扩大两倍。更好的方式是使用 iteritems。
for k, v in d.iteritems(): print(k, v)
iteritems 返回的是迭代器对象,具有惰性加载特性,仅在真正需要时才生成值,迭代过程中无需额外内存装载数据。需要注意的是,在Python 3中,只有 items 方法,它等价于Python 2中的 iteritems,而 iteritems 方法名已被移除。
8、使用字典推导式
推导式是一项出色的特性。列表推导式出现后,map、filter 等函数显得黯然失色。自Python 2.7以后的版本,此特性扩展到了字典和集合,构建字典对象无需再调用 dict 方法。
bad
numbers = [1,2,3]
d = dict([(number,number*2) for number in numbers])
good
numbers = [1, 2, 3]
d = {number: number * 2 for number in numbers}
总结
以上介绍了高效使用Python字典的清单,希望对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。在此非常感谢大家对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









