2017-02-18 82 views
2

指數我有兩個列表包含多字典兩個列表包含字典,每個字典有一個列表作爲值,這些都是我的列表:合併基於其在python

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)
  1. 詞典只能通過 字典從第二個列表(列表2)使用相同的上市指數
  2. 合併這兩個列表被合併後,每本字典都有

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

+2

通過「內聯」循環,你的意思是使用理解結構嗎?當然。儘管使用for語句可能會更清楚。你有嘗試過什麼嗎? –

+2

你無法對字典進行排序,它們本質上是無序的。 – iled

+0

@點好點。我原本雖然OP想要排序的列表值。 –

回答

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。

+0

非常感謝@iled,這幫了我.. – Faizalprbw

+0

@Faizalprbw yw!讓我知道是否有任何可能需要解釋的部分。此外,您可能會發現相關的問題非常有用,例如,[this one](http://stackoverflow.com/questions/72899/how-do-i-sort-a-list-of-dictionaries-by-values-的最字典中的Python)。 – iled

+0

實際上,這是我的問題的非常簡單的例子,我有大json數據包含相同的結構。但你是例子工作,現在我試圖瞭解你自己的語法,如果我'米卡住了,我會問你..非常感謝你.. @iled – Faizalprbw

2

嘗試:

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

對不起,這是不正確的,請參閱OP的第二個要求:*在這兩個列表合併後,必須對每個字典進行排序根據其值的第三個數字* – iled

+0

正如有人在您的問題下面的評論中提到的那樣,不可能對字典進行排序(排序元素)。 –

+0

是的,'某人== iled'。 – iled

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

對不起,這是不正確的,請參閱OP的第二個要求:*在這兩個列表合併後,每個字典必須根據其值的第三個數字排序* – iled

+0

是嘗試第二個需求排序數據。 –

+0

@ililed你的答案。 –

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

或者甚至更短的蟒蛇是3.5+

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