请考虑以下事项:
mylist = ['a','b','c','d']
mydict = {}
for val in mylist:
if val not in mydict:
mydict[val] = []
mydict[val].append(1)
有没有办法避免双重查询(" val in mydict
"和" mydict[val]
")?
注意 - 我尝试使用默认返回值(即mydict.get(val, []).append(1)
),但新列表实际上并未在字典中注册为键的值。例如:
mydict = {}
mydict.get('not_in_dict','default')
mydict
返回{}
。在我的情况下,我想要一些会返回{'not_in_dict' : 'default'}
的东西。
或者这里是正确的答案我不应该担心双重查找? (例如"冷静,伙计,不要优化,如果你不必"或者" python很棒,它已经解决了这个问题")。
我正在使用python 3.4。
答案 0 :(得分:1)
您可以使用dict.setdefault
mylist = ['a','b','c','d']
mydict = {}
for val in mylist:
mydict.setdefault(val,[])
mydict[val].append(1)
或者使用效率更高的collections.defaultdict
from collections import defaultdict
mylist = ['a','b','c','d']
mydict = defaultdict(list)
for val in mylist:
mydict[val].append(1)
In [14]: mylist = ['a','b','c','d']
In [15]: mydict = {}
In [16]: %%timeit
....: for val in mylist:
....: mydict.setdefault(val,[])
....: mydict[val].append(1)
....:
1000000 loops, best of 3: 1.51 µs per loop
In [18]: mydict = defaultdict(list)
In [19]: %%timeit
....: for val in mylist:
....: mydict[val].append(1)
....:
1000000 loops, best of 3: 603 ns per loop
答案 1 :(得分:0)
from collections import defaultdict
mydict = defaultdict(list)
mydict['not in dict'] = 'foo'