1

我想创建一个字典如下 -

{'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>)

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

4

3 回答 3

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. 不过,将特定于上下文的参数传递给该构造函数可能会很棘手。

于 2013-05-22T15:18:34.460 回答
2

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

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

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

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

defaultdict对象具有仅在缺少某些内容时才创建新对象的优势。这个解决方案的优点是是一个简单的字典,没有什么特别的。

编辑

经过思考,我发现使用setdefaulton adefaultdict将按预期工作。但是,还不足以说dict应该使用普通的旧的。在某些情况下,拥有 adict很重要。简而言之,a 上的无效键dict将引发 a KeyError。Adefaultdict将返回一个默认值。

例如,有一种遍历算法,它在捕获 KeyError 或遍历整个路径时停止。使用 a defaultdict,您必须自己提高 KeyError 以防出现错误。

于 2013-05-22T15:30:13.000 回答
0

你可以使用一个defaultdict. (见参考

from collections import defaultdict

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

for l in letters:
    mydict[l].append(<some data>)
于 2013-05-22T15:22:19.583 回答