我有两个列表包含多个字典,每个字典都有一个列表作为值,这些是我的列表:
list1 = [{'a':[12,22,61],'b':[21,12,50]},{'c':[10,11,47],'d':[13,20,45],'e':[11,24,42]},{'a':[12,22,61],'b':[21,12,50]}]
list2 = [{'f':[21,23,51],'g':[11,12,44]},{'h':[22,26,68],'i':[12,9,65],'j':[10,12,50]},{'f':[21,23,51],'g':[11,12,44]}]
在我的情况下,我需要将这些列表与此规则合并:
这是基于上述两条规则的预期结果:
result = [
{'a':[12,22,61],'f':[21,23,51],'b':[21,12,50],'g':[11,12,44]},
{'h':[22,26,68],'i':[12,9,65],'j':[10,12,50],'c':[10,11,47],'d':[13,20,45],'e':[11,24,42]},
{'a':[12,22,61],'f':[21,23,51],'b':[21,12,50],'g':[11,12,44]}
]
我该怎么做?是否有可能在内联循环的python中完成?
答案 0 :(得分:3)
在一行中(如果您不计入导入):
from collections import OrderedDict
[OrderedDict(sorted(dict(d1.items() + d2.items()).items(), key=lambda x: x[1][-1],
reverse=True)) for d1, d2 in zip(list1, list2)]
[OrderedDict([('a', [12, 22, 61]),
('f', [21, 23, 51]),
('b', [21, 12, 50]),
('g', [11, 12, 44])]),
OrderedDict([('h', [22, 26, 68]),
('i', [12, 9, 65]),
('j', [10, 12, 50]),
('c', [10, 11, 47]),
('d', [13, 20, 45]),
('e', [11, 24, 42])]),
OrderedDict([('a', [12, 22, 61]),
('f', [21, 23, 51]),
('b', [21, 12, 50]),
('g', [11, 12, 44])])]
这适用于Python 2.7。
答案 1 :(得分:2)
尝试:
[dict(a, **b) for a,b in zip(list1, list2)]
答案 2 :(得分:1)
词典本质上没有排序,所以如果你不需要它们排序,你可以将它们合并成一个简单的单行。
result = [ {**d1, **d2} for d1, d2 in zip(list1, list2) ] # python 3.5+
如果您使用的是较低版本,请定义合并功能。
def merge(d1, d2):
result = d1.copy()
result.update(d2)
return result
然后
result = [ merge(d1, d2) for d1, d2 in zip(list1, list2) ]
如果你确实需要它们排序,那么你唯一的选择是使用OrderedDict
from collections import OrderedDict
def merge(d1, d2):
tempD = d1.copy()
tempD.update(d2)
return OrderedDict(sorted(tempD.items(), key = lambda t: t[1][2], reverse = True))
result = [ merge(d1, d2) for d1, d2 in zip(list1, list2) ]
甚至更短的python 3.5+是
result = [ OrderedDict(sorted(({**d1, **d2}).items(), key = lambda t: t[1][2], reverse = True)) for d1, d2 in zip(list1, list2) ]
答案 3 :(得分:0)
你可以为你的结果这样做:
r = map(lambda x,y:dict(x.items() + y.items()), list1, list2)
结果:
[{'a': [12, 22, 61], 'b': [21, 12, 50], 'g': [11, 12, 44], 'f': [21, 23, 51]},
{'c': [10, 11, 47], 'e': [11, 24, 42], 'd': [13, 20, 45], 'i': [12, 9, 65], 'h': [22, 26, 68], 'j': [10, 12, 50]},
{'a': [12, 22, 61], 'b': [21, 12, 50], 'g': [11, 12, 44], 'f': [21, 23, 51]}]