Skip to main content
 首页 » 编程设计

python之使用索引从两个列表制作字典

2025年05月04日11txw1958

我有两个列表:

alist =  [11,12,13,11,15] 
blist = ['A', 'A', 'B', 'A', 'B'] 

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

结果应该是:

{'A': [11, 12, 11], 'B': [13, 15]} 

我试过这个:

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

给出结果:

{'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]} 

为什么它不追加到字典中已有的字母上,而是在它已经在字典中时添加它?

请您参考如下方法:

使用 defaultdict 来简化操作:

from collections import defaultdict 
 
dictNames = defaultdict(list) 
for key, value in zip(blist, alist): 
    dictNames[key].append(value) 

这会创建:

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

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

如果没有 defaultdict,您必须使用 setdefault() 测试 key 是否已经存在:

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

导致:

>>> dictNames 
{'A': [11, 12, 11], 'B': [13, 15]} 

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