创建一个python字典,其中包含以列表作为其值的唯一键

时间:2013-05-22 15:14:53

标签: python

我想创建一个字典如下 -

{'a':[1, 2, 3, 4, 5], 'b':[1, 3, 5], 'c':[2, 3, 5]}

我实施它的方式是

mydict = dict()
letters = ['a', 'b', 'a', 'c', 'a'] 

#please mark the list has multiple occurence of a, 
#hence I would want to check if a key with 'a' exists. Please do not advise to make the list unique. 
for l in letters:
    if not mydict.get(l):
        mydict[l] =  <values from another place via some filter>
    else:
        mydict[l].append(<values from another dict>)

有没有更好的方法来做到这一点?

3 个答案:

答案 0 :(得分:4)

是的,您可以使用defaultdict

示例代码:

»»» from collections import defaultdict

»»» mydict = defaultdict(list)

»»» letters = ['a', 'b', 'a', 'c', 'a'] 

»»» for l in letters:
   ....:     mydict[l].append('1')
   ....:     

»»» mydict
Out[15]: defaultdict(<type 'list'>, {'a': ['1', '1', '1'], 'c': ['1'], 'b': ['1']})

如果您需要将内容初始化为更高级的内容,则可以将自己的构造函数指定为defaultdict的第一个参数。将特定于上下文的参数传递给该构造函数可能会很棘手。

答案 1 :(得分:2)

m01提供的解决方案很酷,但我相信值得一提的是我们可以用普通的dict对象来做到这一点。

mydict = dict()
letters = ['a', 'b', 'a', 'c', 'a']

for l in letters:
    mydict.setdefault(l, []).append('1')

结果应该是一样的。你将有一个默认的dict而不是使用子类。这真的取决于你在寻找什么。我的猜测是,我的解决方案的一大问题是即使不需要它也会创建一个新列表。

defaultdict对象的优点是只在缺少某些内容时才创建新对象。这种解决方案的优点是可以成为一个简单的字典而没有什么特别的。

修改

在考虑之后,我发现在setdefault上使用defaultdict将按预期工作。但是,应该使用普通的dict来代替它还不够好。有些情况下dict很重要。要缩短,dict上的无效密钥会引发KeyErrordefaultdict将返回默认值。

作为一个例子,有遍历算法在捕获KeyError或遍历整个路径时停止。使用defaultdict时,如果出现错误,您必须自己提出KeyError。

答案 2 :(得分:0)

您可以使用defaultdict。 (见reference

from collections import defaultdict

mydict = defaultdict(list)
letters = ['a', 'b', 'a', 'c', 'a'] 

for l in letters:
    mydict[l].append(<some data>)