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

80 投票
6 回答
67206 浏览
提问于 2025-04-15 21:31

我最近又开始学Python了,感觉非常不错。不过,我发现自己总是遇到一个重复的模式。我总觉得应该有更好的方法来表达我想要的东西,可能我做得不太对。

我写的代码大致是这样的:

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

我在我的程序中经常写这样的代码。我的第一反应是把它提取到一个辅助函数里,但很多时候,Python的库里已经有类似的功能了。

我是不是漏掉了什么简单的语法技巧?还是说这样做就是正确的方式?

6 个回答

9

我做了一些时间比较。结果差不多。不过,单行的 .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()
136

字典(dict)的 get() 方法有一个可选的第二个参数,这个参数可以用来提供一个默认值,假如你要找的键不存在的话:

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

使用一个 defaultdict

from collections import defaultdict

foo = defaultdict(int)
foo[bar] += 1

在 Python 版本 2.7 及以上,你还有一个专门的 Counter 类来处理这些情况。如果你用的是 Python 2.5 或 2.6,可以使用它的 回溯版本

撰写回答