嗨,我想将两个列表合并为一个字典。假设我有两个列表,如下面的
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}
感谢
答案 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)