Python 在字典中压缩两个列表,但在键中保留重复项

Python 在字典中压缩两个列表,但在键中保留重复项,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我有两份清单: 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} 词典的理想形式

我有两份清单:

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,'key4':30004,'key4': 30004,‘键5’: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
对象具有唯一的键。您应该只使用元组列表:

>>> 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必须只使用唯一的键,如果插入两次相同的键,最后一个键将被存储-这可能是您可以使用的:

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

因为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))

你不能这样做,你不能在
dict
中使用相同的名称
key
,因此,最好使用tupleYes,字典必须具有唯一的、可散列的键,因此你需要查看非键集合,如列表或元组。正如您可能知道的,集合还将删除重复项。还有另一种可能的解决方案是的,使用前面提到的列表或元组。尝试以下代码:tuple(zip(alist,blist))或list(zip(alist,blist))。你不能这样做,你不能在
dict
中使用相同的名称
key
,因此,最好使用tupleYes,字典必须具有唯一的、可散列的键,所以你需要查看非键集合,例如list或tuple。正如您可能知道的,集合还将删除重复项。还有另一种可能的解决方案是的,使用前面提到的列表或元组。尝试以下代码:tuple(zip(alist,blist))或list(zip(alist,blist))。