关于python:在构建字典时增加值的Pythonic方法

Pythonic way to increment value when building dictionary

本问题已经有最佳答案,请猛点这里访问。

工作脚本中的一小段代码;我只是好奇是否有一种"更漂亮"的方法来实现相同的结果。

1
2
3
4
    if ctry in countries:
        countries[ ctry ] += 1
    else:
        countries[ ctry ] = 1

在awk中,我本可以使用countries[ ctry ] += 1,但python抛出了一个键错误(可以理解)。


您可以将countries改为collections.defaultdict对象,而不是使用普通字典。顾名思义,如果密钥还不存在,collections.defaultdict允许您在字典中插入默认值:

1
2
from collections import defaultdict
countries = defaultdict(int)

然后你的狙击手变成一条线:

1
countries[cntry] += 1

如果你不能使用collections.defaultdict,你可以使用"请求原谅而不是允许"的成语:

1
2
3
4
try:
    countries[ ctry ] += 1
except KeyError:
    countries[ ctry ] = 1

尽管上述行为与您的条件陈述类似,但我们认为更多的是"Python式的",因为使用的是try/except,而不是if/else


下面是一个有点像Python:

1
countries[ctry]  = 1 if ctry not in countries else countries[ctry] + 1

1
countries[ctry] = countries.get(ctry, 0) + 1


另一种选择是使用defaultdict:

1
2
3
from collections import defaultdict
countries = defaultdict(int)
countries[ctry] += 1

速度测试:

1
2
3
4
5
6
%timeit countries['Westeros'] += 1
10000000 loops, best of 3: 79 ns per loop

countries = {}
%timeit countries['Westeros'] = countries.get('Westeros', 0) + 1
1000000 loops, best of 3: 164 ns per loop