根据python中的索引合并两个包含列表的字典
我有两个列表包含多个字典,每个字典都有一个列表作为值,这些是我的列表:根据python中的索引合并两个包含列表的字典,python,list,dictionary,indexing,Python,List,Dictionary,Indexing,我有两个列表包含多个字典,每个字典都有一个列表作为值,这些是我的列表: 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':[
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进行内联循环吗?试试:
[dict(a, **b) for a,b in zip(list1, list2)]
对于结果,您可以这样做:
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]}]
字典不是按性质排序的,所以如果您不需要对它们进行排序,您可以将它们合并到一行中
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) ]
如果您确实需要对它们进行排序,那么您唯一的选择就是使用OrderedICT
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) ]
在一行中(如果不计入导入):
这在Python 2.7中起作用。所谓“内联”循环,是指使用理解结构吗?当然不过,使用for语句可能会更清楚。“你试过什么了吗?你不能给字典排序,它们天生就是无序的。”我说得好。我本来想让OP对列表值进行排序?否则,您无法对字典进行排序。即使这样,也很棘手,因为您只能通过以正确的顺序构造它们来对它们进行排序。在较旧的Python上,您可以使用标准库附带的OrderedDict数据类型。但也许您可以找到另一种更适合您的问题的数据类型。很抱歉,这是不正确的,请参阅OP的第二个要求:合并这两个列表后,每个字典都必须根据其值的第三个数字进行排序。尝试第二个要求排序的数据。@iled+1作为您的答案。很抱歉,这是不正确的,请参阅OP的第二个要求:合并这两个列表后,必须根据其值的第三个数字对每个词典进行排序。正如您问题下面的注释中提到的某个人,无法对词典(元素)进行排序。是的,
someone==iled
。哦,是的,我的错!没有看到你的名字。现在可以了(CPython 3.6+@Faizalprbw-yw!如果有任何部分需要解释,请告诉我。此外,您可能会发现相关问题非常有用,例如。实际上,这是我问题的一个非常简单的示例,我有一个大json数据包含与此相同的结构。。但你们的例子是有效的,现在我试图理解你们自己的语法,如果我被卡住了,我会问你们。。非常感谢@伊莱德苏。基本上这里有两个主要问题:1。合并词典;2.对字典进行分类。对于第一部分,您可能会发现非常有用。关于第二点,请参见我之前评论中的链接。用于包装这些内容的语法是列表理解和。请注意,这对python 3不起作用,结果不再包含字典,并且在这种情况下使用orderedict
不会改变任何内容。@StevenSummers谢谢,我的sorted
和orderedict
顺序错误。我没有使用Python3,很抱歉没有首先指定它。
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])])]