Python字典高效使用指南:8个实用技巧

木白
木白
发布时间:2026-10-13| 5人浏览过
原创

本文整理了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字典的清单,希望对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。在此非常感谢大家对本站的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。