我想创建一个字典如下 -
{'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>)
有没有更好的方法来做到这一点?
答案 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
上的无效密钥会引发KeyError
。 defaultdict
将返回默认值。
作为一个例子,有遍历算法在捕获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>)