字典理解

一个字典理解相似,除了它产生一个字典对象,而不是一个列表的列表解析。

一个基本的例子:

Python 2.x >= 2.7

{x: x * x for x in (1, 2, 3, 4)}
# Out: {1: 1, 2: 4, 3: 9, 4: 16}

这只是另一种写作方式:

dict((x, x * x) for x in (1, 2, 3, 4))
# Out: {1: 1, 2: 4, 3: 9, 4: 16}

与列表推导一样,我们可以在 dict 理解中使用条件语句来仅生成满足某些标准的 dict 元素。

Python 2.x >= 2.7

{name: len(name) for name in ('Stack', 'Overflow', 'Exchange') if len(name) > 6}  
# Out: {'Exchange': 8, 'Overflow': 8}

或者,使用生成器表达式重写。

dict((name, len(name)) for name in ('Stack', 'Overflow', 'Exchange') if len(name) > 6)
# Out: {'Exchange': 8, 'Overflow': 8}

从字典开始并使用字典理解作为键值对过滤器

Python 2.x >= 2.7

initial_dict = {'x': 1, 'y': 2}
{key: value for key, value in initial_dict.items() if key == 'x'}
# Out: {'x': 1}

切换键和字典值(反转字典)

如果你有一个包含简单 hashable 值的 dict (重复值可能有意想不到的结果):

my_dict = {1: 'a', 2: 'b', 3: 'c'}

并且你想要交换键和值,你可以采取多种方法,具体取决于你的编码风格:

  • swapped = {v: k for k, v in my_dict.items()}
  • swapped = dict((v, k) for k, v in my_dict.iteritems())
  • swapped = dict(zip(my_dict.values(), my_dict))
  • swapped = dict(zip(my_dict.values(), my_dict.keys()))
  • swapped = dict(map(reversed, my_dict.items()))
print(swapped)
# Out: {a: 1, b: 2, c: 3}

Python 2.x >= 2.3

如果你的字典很大,请考虑导入 itertools 并使用 izipimap

合并字典

组合字典并使用嵌套字典理解可选地覆盖旧值。

dict1 = {'w': 1, 'x': 1}
dict2 = {'x': 2, 'y': 2, 'z': 2}

{k: v for d in [dict1, dict2] for k, v in d.items()}
# Out: {'w': 1, 'x': 2, 'y': 2, 'z': 2}

但是,字典解包( PEP 448 )可能是首选。

Python 3.x >= 3.5

{**dict1, **dict2}
# Out: {'w': 1, 'x': 2, 'y': 2, 'z': 2}

注意字典理解在 Python 3.0 中添加并向后移植到 2.7+,与列表推导不同,后者在 2.0 中添加。版本<2.7 可以使用生成器表达式和 dict() 内置来模拟字典理解的行为。