使用索引从两个列表中创建字典

edg*_*edg 1 python

我有两个清单:

alist =  [11,12,13,11,15]
blist = ['A', 'A', 'B', 'A', 'B']
Run Code Online (Sandbox Code Playgroud)

我想创建一个字典,其中blist中的项是键,而alist中的项是值,列表对应于两个列表中的索引:

结果应该是:

{'A': [11, 12, 11], 'B': [13, 15]}
Run Code Online (Sandbox Code Playgroud)

我试过这个:

dictNames = {}
for i in xrange(len(alist)):
    for letter in blist:
        if letter not in dictNames:
            dictNames[letter] = []
        else:
            dictNames[letter].append(alist[i])
Run Code Online (Sandbox Code Playgroud)

结果如下:

{'A': [11, 11, 12, 12, 12, 13, 13, 13, 11, 11, 11, 15, 15, 15], 'B': [11, 12, 12, 13, 13, 11, 11, 15, 15]}
Run Code Online (Sandbox Code Playgroud)

为什么它不会附加到字典中预先存在的字母而不是在它已经在字典中时添加到它?

Mar*_*ers 6

使用defaultdict便于:

from collections import defaultdict

dictNames = defaultdict(list)
for key, value in zip(blist, alist):
    dictNames[key].append(value)
Run Code Online (Sandbox Code Playgroud)

这会创建:

>>> dictNames
defaultdict(<type 'list'>, {'A': [11, 12, 11], 'B': [13, 15]})
Run Code Online (Sandbox Code Playgroud)

defaultdict是一个子类,dict因此它仍然可以像其他任何一样工作dict.

没有defaultdict你将不得不测试密钥是否已经存在setdefault():

dictNames = {}
for key, value in zip(blist, alist):
    dictNames.setdefault(key, []).append(value)
Run Code Online (Sandbox Code Playgroud)

导致:

>>> dictNames
{'A': [11, 12, 11], 'B': [13, 15]}
Run Code Online (Sandbox Code Playgroud)

这里真正的技巧是使用zip()组合键和值列表而不是双循环.