Pythonic方法将值添加到字典

时间:2016-08-24 23:16:53

标签: python dictionary

假设我有一套集词典:

d = {"foo":{1,2,3},
        "bar":{3,4,5}}

现在假设我想将值7添加到密钥foo中找到的集合中。这很简单:

d["foo"].add(7)

但如果我们不确定已存在的密钥怎么办?事先检查它并不是非常pythonic:

if "baz" in dict:
    d["baz"].add(7)
else:
    d["baz"] = {7}

我试图变得聪明并做一些像

这样的事情
d["baz"] = set(d["baz"]).add(7)

但是你只是得到一个KeyError试图访问set构造函数中的错误密钥。

我错过了什么,或者我需要咬紧牙关,看看我跳跃之前?我会理解,如果是这种情况,如果有一种简单的方式可以说“#34;将此值添加到此位置找到的集合中,或者如果没有设置在该位置,那么它就会很简洁,制作一个,然后把它放进去。

2 个答案:

答案 0 :(得分:14)

使用defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(set)
>>> d
defaultdict(<class 'set'>, {})
>>> d['foo'].add(1)
>>> d['foo'].add(2)
>>> d
defaultdict(<class 'set'>, {'foo': {1, 2}})
>>> d['bar'].add(3)
>>> d['bar'].add(4)
>>> d
defaultdict(<class 'set'>, {'foo': {1, 2}, 'bar': {3, 4}})
>>> 

此外,如果您必须使用普通字典,则可以使用.setdefault方法:

>>> d2 = {}
>>> d2.setdefault('foo',set()).add(1)
>>> d2.setdefault('foo',set()).add(2)
>>> d2
{'foo': {1, 2}}
>>> d2.setdefault('bar',set()).add(3)
>>> d2.setdefault('bar',set()).add(4)
>>> d2
{'foo': {1, 2}, 'bar': {3, 4}}
>>> 

编辑以添加时间比较

您应该注意使用defaultdict的速度更快:

>>> setup = "gen = ((letter,k) for letter in 'abcdefghijklmnopqrstuvwxyx'  for k in range(100)); d = {}"
>>> s = """for l,n in gen:
...     d.setdefault(l,set()).add(n)"""
>>> setup2 = "from collections import defaultdict; gen = ((letter,k) for letter in 'abcdefghijklmnopqrstuvwxyx'  for k in range(100)); d = defaultdict(set)"
>>> s2 = """for l,n in gen:
...     d[l]=n"""
>>> 
>>> import timeit
>>> timeit.timeit(stmt=s, setup=setup, number=10000)
0.005325066005752888
>>> timeit.timeit(stmt=s2, setup=setup2, number=10000)
0.0014927469965186901

答案 1 :(得分:2)

试图保持这个简单,这个怎么样

dict['baz'] = dict.get('baz', set())
dict['baz'].add(7)