Merge two list contained dictionary based on its index in python

孤街浪徒 提交于 2020-01-02 12:02:09

问题


I have two list contain multi dictionary, each dictionary has a list as value, these are my list:

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

In my case, i need to merge these list with this rule:

  1. Dictionary from the first list (list1) only can be merged by dictionary from the second list (list2) with the same listing index
  2. After both of these list are merged, each dictionary has to be sorted based on the third number of its value

This is the expected result based on two rule above:

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

How can i do that? is it possible to be done in python with inline looping?


回答1:


In one line (if you do not count with the import):

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])])]

This works in Python 2.7.




回答2:


Try:

[dict(a, **b) for a,b in zip(list1, list2)]



回答3:


Dictionaries are not sorted by nature, so if you don't need them sorted your can merge them in a simple one-liner.

result = [ {**d1, **d2} for d1, d2 in zip(list1, list2) ] # python 3.5+

If you are using a lower version then define a merge function.

def merge(d1, d2):
    result = d1.copy()
    result.update(d2)
    return result

And then have

result = [ merge(d1, d2) for d1, d2 in zip(list1, list2) ]

If you do need them sorted then your only option is to use an 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) ]

Or even shorter for python 3.5+ is

result = [ OrderedDict(sorted(({**d1, **d2}).items(), key = lambda t: t[1][2], reverse = True)) for d1, d2 in zip(list1, list2) ]



回答4:


You can do like this for your result :

r = map(lambda x,y:dict(x.items() + y.items()), list1, list2)

Result :

[{'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]}]


来源:https://stackoverflow.com/questions/42311288/merge-two-list-contained-dictionary-based-on-its-index-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!