查找字典值初始化

时间:2014-09-30 22:27:33

标签: python python-3.x

请考虑以下事项:

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。

2 个答案:

答案 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'