2017-09-14 71 views
1

工作,我有這2所列出輸入:合併功能將只有序列表

list1 = [['A', 14, 'I', 10, 20], ['B', 15, 'S', 30, 40], ['C', 16, 'F', 50, 60]] 
list2 = [['A', 14, 'Y', 0, 200], ['B', 15, 'M', 0, 400], ['C', 17, 'G', 0, 600]] 

和我希望的輸出是這樣的:

finalList = [['A', 14, 'Y', 10, 200], ['B', 15, 'M', 30, 400], ['C', 16, 'F', 50, 60],['C', 17, 'G', 0, 600]] 

使用此功能:

def custom_merge(list1, list2): 
    finalList = [] 
    for sub1, sub2 in zip(list1, list2): 
     if sub1[1]==sub2[1]: 
      out = sub1.copy() 
      out[2] = sub2[2] 
      out[4] = sub2[4] 
      finalList.append(out) 
     else: 
      finalList.append(sub1) 
      finalList.append(sub2) 
    return finalList 

我會得到我想要的輸出,但如果我切換位置(list2 [1]和list2 [2])和我的列表2:

list2 = [['A', 14, 'Y', 0, 200], ['C', 17, 'G', 0, 600], ['B', 15, 'M', 0, 400]] 

那麼輸出將是這樣的:

[['A', 14, 'Y', 10, 200], ['B', 15, 'S', 30, 40], ['C', 17, 'G', 0, 600], ['C', 16, 'F', 50, 60], ['B', 15, 'M', 0, 400]] 

(注意額外[ 'B',15, 'M',0,400])

我有什麼修改我的函數爲了獲得我的第一個期望的輸出,如果我的列表在我的列表中有不同的順序!?我使用python 3.謝謝!

以後編輯:

合併規則: 當list1[listindex][1] == list2[listindex][1](例如:當14==14),取代list1 - >list2[2]list2[4](例如: 'Y' 和200),如果不只是添加從無與倫比的列表list2list1,因爲它是(像我期望的輸出),並保持這種不匹配是在列表1中的人(例如:['C', 16, 'F', 50, 60]

要注意的是,列表1和List2可以有不同的LEN(列表1罐比列表2有更多的列表,反之亦然)

EDIT.2 我發現這一點:

def combine(list1,list2): 
    combined_list = list1 + list2 
    final_dict = {tuple(i[:2]):tuple(i[2:]) for i in combined_list} 
    merged_list = [list(k) + list (final_dict[k]) for k in final_dict] 
    return merged_list 

^^可以工作,還在測試!

+3

不知道什麼是這裏的合併邏輯。 –

+0

在我的原始文章中添加了合併規則。 –

回答

1

在合併之前,您可以按照子列表中的第一個元素對列表進行排序。

def custom_merge(list1, list2): 
    finalList = [] 
    for sub1, sub2 in zip(sorted(list1), sorted(list2)): 
     if sub1[1]==sub2[1]: 
      out = sub1.copy() 
      out[2] = sub2[2] 
      out[4] = sub2[4] 
      finalList.append(out) 
     else: 
      finalList.append(sub1) 
      finalList.append(sub2) 
    return finalList 

測試:

list1 = [['A', 14, 'I', 10, 20], ['B', 15, 'S', 30, 40], ['C', 16, 'F', 50, 60]] 
list2 = [['A', 14, 'Y', 0, 200], ['C', 17, 'G', 0, 600], ['B', 15, 'M', 0, 400]] 
custom_merge(list1, list2) 
# returns: 
[['A', 14, 'Y', 10, 200], 
['B', 15, 'M', 30, 400], 
['C', 16, 'F', 50, 60], 
['C', 17, 'G', 0, 600]] 
+0

嗯,如果我在列表2中添加一個額外的列表:['S',20,'Y',0,200],我不會在輸出中看到它 –

+0

@EricDuminil:並非如此。我更新了。 – James

+0

@TatuBogdan:zip總是會截斷爲shorted迭代。因此,如果您提供3個元素的列表和10個元素的列表,您將從更長的列表中獲得前3個元素。 – James