将两个列表合并到字典中,同时在python中保留重复数据

时间:2017-12-12 04:08:12

标签: python python-2.7 list dictionary

嗨,我想将两个列表合并为一个字典。假设我有两个列表,如下面的

list_one = [' a',' a',' c',' d']

list_two = [1,2,3,4]

我想让我的字典像这样

{'a': 1, 'a': 2, 'c': 3, 'd': 4}

截至目前,我有以下代码

print dict(zip(['a', 'a', 'c', 'd'], [1,2,3,4]))

但上面代码的输出是这个

{'a': 2, 'c': 3, 'd': 4}

我怎样才能使它成为这个输出?

{'a': 1, 'a': 2, 'c': 3, 'd': 4}

感谢

8 个答案:

答案 0 :(得分:7)

dict s的一个定义特征是每个键都是唯一的。因此,您不能拥有两个'a'键。否则,my_dict['a']会返回什么?

答案 1 :(得分:4)

字典必须具有唯一键,因此您必须更改您的要求。如何将元组列表作为解决方法?

l = list(zip(['a', 'a', 'c', 'd'],[1,2,3,4]))
print(l)

结果是:

[('a', 1), ('a', 2), ('c', 3), ('d', 4)]

您可以像这样轻松迭代和解压缩:

for k, v in l:
    print("%s: %s" % (k, v))

产生:

a: 1
a: 2
c: 3
d: 4

如果你想要它可以使用,你可以像这样创建一个元组元组:

l = tuple(zip(['a', 'a', 'c', 'd'],[1,2,3,4]))

答案 2 :(得分:3)

由于词典中的键是唯一的,因此对于常规python词典来说,获取{'a': 1, 'a': 2, 'c': 3, 'd': 4}是不可能的,因为键'a'只能出现一次。但是,您可以将一个键映射到列表中存储的多个值,例如{'a': [1, 2], 'c': [3], 'd': [4]}

一种选择是创建一个defaultdict,以便您轻松完成此任务:

from collections import defaultdict

list_one = ['a', 'a', 'c', 'd']

list_two = [1, 2, 3, 4]

d = defaultdict(list)
for key, value in zip(list_one, list_two):
    d[key].append(value)

print(dict(d))

哪个输出:

{'a': [1, 2], 'c': [3], 'd': [4]}

答案 3 :(得分:1)

来自documentation for dictionaries

  

最好将字典视为一组无序的键:值对,,要求键是唯一的(在一个字典中)。一对大括号创建一个空字典:{}。在括号内放置以逗号分隔的键:值对列表,将初始键:值对添加到字典中;这也是字典在输出上的写法。

答案 4 :(得分:1)

Dictionary具有唯一键。如果您需要'a'的值将压缩数据单独存储在列表中,或者您可以在dict的值部分中使用list并将值存储为: {'a':[1,2],'c':[3],'d':[4]}

答案 5 :(得分:1)

正如其他答案所指出的,词典具有唯一键,但是,可以创建一个模仿您正在寻找的行为的结构:

class NewDict:
   def __init__(self, *values):
       self.values = list(zip(*values))
   def __getitem__(self, key):
        return [b for a, b in sorted(self.values, key=lambda x:x[0]) if a == key]
   def __repr__(self):
       return "{}({})".format(self.__class__.__name__, "{"+', '.join("{}:{}".format(*i) for i in sorted(self.values, key=lambda x:x[0]))+"}")

list_one = ['a', 'a', 'c', 'd']
list_two = [1,2,3,4]
d = NewDict(list_one, list_two)
print(d['a'])
print(d)

输出:

[1, 2]
NewDict({a:1, a:2, c:3, d:4})

答案 6 :(得分:0)

您有两种选择:

要么使用元组:

list_one = ['a', 'a', 'c', 'd']

list_two = [1,2,3,4]



print(list(map(lambda x,y:(x,y),list_one,list_two)))

输出:

[('a', 1), ('a', 2), ('c', 3), ('d', 4)]

第二个选项是使用这种模式:

dict_1={}

for key,value in zip(list_one,list_two):
    if key not in dict_1:
        dict_1[key]=[value]
    else:
        dict_1[key].append(value)

print(dict_1)

输出:

{'a': [1, 2], 'd': [4], 'c': [3]}

答案 7 :(得分:0)

字典中的键应该是唯一的。

根据python文档:

  

最好将字典视为一组无序的键:值对,并要求键是唯一的(在一个字典中)。

link 到文档