ZIP在字典中的两个列表,但将重复的内容保留在密钥中



我有两个列表:

alist = ['key1','key2','key3','key3','key4','key4','key5']
blist=  [30001,30002,30003,30003,30004,30004,30005]

我想合并这些列表并将它们添加到字典中。

我尝试dict(zip(alist,blist)),但这给出了:

{'key3':30003,'key2':30002,'key1':30001,'key5':30005,'key4': 30004}

字典的所需形式为:

{'key1':30001,'key2':30002,'key3':30003,'key3':30003,'key4':30004,'key4': 30004,'key5':30005}

我想将重复项保留在字典中,并且不在同一键中加入值(... key3':30003,'key3':30003,...(。是否可能?

预先感谢。

您无法执行此操作,因为dict对象只能具有唯一的键。相反,您应该使用元组列表:

>>> alist = ['key1','key2','key3','key3','key4','key4','key5']
>>> blist=  [30001,30002,30003,30003,30004,30004,30005]
>>> zip(alist, blist)
[('key1', 30001), ('key2', 30002), ('key3', 30003), ('key3', 30003), ('key4', 30004), ('key4', 30004), ('key5', 30005)]

如果要基于密钥访问所有值,则可以使用collections.defaultdict为:

>>> from collections import defaultdict
>>> my_dict = defaultdict(list)
>>> for k, v in zip(alist, blist):
...     my_dict[k].append(v)
...
>>> my_dict
defaultdict(<type 'list'>, {'key3': [30003, 30003], 'key2': [30002], 'key1': [30001], 'key5': [30005], 'key4': [30004, 30004]})

您可以访问类似于普通dict对象的defaultdict。例如:

>>> my_dict['key3']
[30003, 30003]

词典使用 unique 键,因此具有重复项不可能。

,因为dict必须仅使用唯一键,如果将同一键插入最后一个键,则可以存储最后一个键 - 这可能是您可以使用的东西:

from itertools import groupby
alist = ['key1','key2','key3','key3','key4','key4','key5']
alist = [i for i, j in groupby(alist)]
blist = [30001,30002,30003,30003,30004,30004,30005]
blist = [list(j) for i, j in groupby(blist)]
print dict(zip(alist, blist))
#{'key3': [30003, 30003], 'key2': [30002], 'key1': [30001], 'key5': [30005], 'key4': [30004, 30004]}

如果要保留密钥顺序,则可以使用OrderedDict:

from collections import OrderedDict
print OrderedDict(zip(alist, blist))

@moinuddinquadri的好答案。我进一步扩展了它以获取索引:

my_dict = defaultdict(list)
for idx, tup in enumerate(zip(alist, blist)):
    my_dict[tup[0]].append((idx, tup[1])

最新更新