2.3.8 使用字典推导式

在Python程序中,字典推导和本章前面讲解的列表推导的用法类似,只是将列表中的中括号修改为字典中的大括号而已。下面的实例文件zitui.py演示了使用字典推导式实现合并大小写key的过程。

源码路径:daima\第2章\zitui.py

mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_frequency = {
    k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0)
    for k in mcase.keys()
    if k.lower() in ['a','b']
}
print (mcase_frequency)

执行上述代码后会输出:

{'a': 17, 'b': 34}

再看下面的实例文件ti.py,功能是快速更换字典中key和value的值。

源码路径:daima\第2章\ti.py

mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print(mcase_frequency)

执行上述代码后会输出:

{10: 'a', 34: 'b'}

再看下面的实例文件tiqu.py,功能是使用字典推导式从字典中提取子集。

源码路径:daima\第2章\tiqu.py

  prices = {'ASP.NET': 49.9, 'Python': 69.9, 'Java': 59.9, 'C语言': 45.9, 'PHP': 79.9}
①p1 = {key: value for key, value in prices.items() if value > 50}
  print(p1)
  tech_names = {'Python', 'Java', 'C语言'}
②p2 = {key: value for key, value in prices.items() if key in tech_names}
  print(p2)
p3 = dict((key, value) for key, value in prices.items() if value > 50)  # 慢
print(p3)
tech_names = {'Python', 'Java', 'C语言'}
p4 = {key: prices[key] for key in prices.keys() if key in tech_names}   # 慢
print(p4)

在Python程序中,虽然大部分可以用字典推导式解决的问题,也可以通过创建元组序列,然后将它们传给dict()函数来完成,例如①中的做法。但是使用字典推导式的方案更加清晰,而且实际运行起来也要快很多,以②中的字典prices进行测试,效率要提高两倍左右。执行上述代码后会输出:

{'Python': 69.9, 'Java': 59.9, 'PHP': 79.9}
{'Python': 69.9, 'Java': 59.9, 'C语言': 45.9}
{'Python': 69.9, 'Java': 59.9, 'PHP': 79.9}
{'Python': 69.9, 'Java': 59.9, 'C语言': 45.9}