使用索引从两个列表制作词典

2024-09-28 01:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子:

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

为什么它不附加到字典中已经存在的字母上,而不是在字典中已经存在的字母上添加?你知道吗


Tags: in列表forlenif字典字母not
3条回答

这样可以保持秩序

from collections import defaultdict

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

d = defaultdict(list)
seen = defaultdict(set)

for k, v in zip(blist, alist):
    if v not in seen[k]:
        d[k].append(v)
        seen[k].add(v)

print d

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

首先,在两个列表上循环。对于列表中的每一项,它都会循环浏览blist。所以内部循环运行了25次。相反,您希望它运行5次,因此您只需要一个循环。你知道吗

第二,如果列表还不存在,您可以正确地初始化它,但是在这种情况下,不会将数字添加到列表中。即使是新列表,也应始终将数字添加到列表中。你知道吗

我修改了您的代码,将这两个因素考虑在内,效果更好:

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

输出:

{'A': [11, 12, 11], 'B': [13, 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]})

defaultdictdict的一个子类,因此它仍然可以像其他dict一样工作。你知道吗

如果没有defaultdict,则必须测试键是否已经存在于setdefault()

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

导致:

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

这里真正的技巧是使用^{}组合键和值列表,而不是使用双循环。你知道吗

相关问题 更多 >

    热门问题