假设我有一套集词典:
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;将此值添加到此位置找到的集合中,或者如果没有设置在该位置,那么它就会很简洁,制作一个,然后把它放进去。
答案 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)