根据python中的索引合并两个包含字典的字典

时间:2017-02-18 05:08:22

标签: 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':[21,23,51],'g':[11,12,44]}]

在我的情况下,我需要将这些列表与此规则合并:

  1. 第一个列表(list1)中的字典只能合并 具有相同列表索引的第二个列表(list2)中的字典
  2. 合并这两个列表后,每个字典必须根据其值的第三个数字进行排序
  3. 这是基于上述两条规则的预期结果:

    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中完成?

4 个答案:

答案 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]}]