如何添加或增加字典条目?

我目前正在与Python重新合作,并且热爱它。 但是,我发现自己一遍又一遍地重复着。 我一直在想,必须有更好的方式来expression我想要的,而且我可能做错了。

我正在写的代码是以下面的forms:

# foo is a dictionary if foo.has_key(bar): foo[bar] += 1 else: foo[bar] = 1 

我在我的程序中写了很多。 我的第一反应是把它推到一个辅助函数,但是python库经常提供这样的东西。

是否有一些简单的语法小技巧,我错过了? 或者这是应该做的方式?

使用defaultdict

 from collections import defaultdict foo = defaultdict(int) foo[bar] += 1 

在Python> = 2.7中,你也有一个单独的Counter类用于这些目的。 对于Python 2.5和2.6,您可以使用其反向移植的版本 。

dictget()方法带有可选的第二个参数,如果找不到请求的键,可以使用它来提供默认值:

 foo[bar] = foo.get(bar, 0) + 1 

我做了一些比较。 非常平等。 但是,一行.get()命令是最快的。

输出:

 get 0.543551800627 exception 0.587318710994 haskey 0.598421703081 

码:

 import timeit import random RANDLIST = [random.randint(0, 1000) for i in range(10000)] def get(): foo = {} for bar in RANDLIST: foo[bar] = foo.get(bar, 0) + 1 def exception(): foo = {} for bar in RANDLIST: try: foo[bar] += 1 except KeyError: foo[bar] = 1 def haskey(): foo = {} for bar in RANDLIST: if foo.has_key(bar): foo[bar] += 1 else: foo[bar] = 1 def main(): print 'get', timeit.timeit('get()', 'from __main__ import get', number=100) print 'exception', timeit.timeit('exception()', 'from __main__ import exception', number=100) print 'haskey', timeit.timeit('haskey()', 'from __main__ import haskey', number=100) if __name__ == '__main__': main() 

对于Python> = 2.5,您可以执行以下操作:

 foo[bar] = 1 if bar not in foo else foo[bar]+1 

您还可以利用exception处理中的控制结构。 尝试将值分配给不存在的键时,字典会引发KeyErrorexception:

 my_dict = {} try: my_dict['a'] += 1 except KeyError, err: # in 2.6: `except KeyError as err:` my_dict['a'] = 1