2017-09-08 71 views
0

我有這2列出的清單列表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]] 

(這僅僅是一個只有3列出的樣品,我有更多的名單,但他們是在完全一樣的格式並應用相同的規則)

,這將是我想要的輸出:

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

這是規則怎麼計算finalList:

list1[listindex][1] == list2[listindex][1](例如:當14 == 14)時,替換list1 -> list2[2]list2[4](例如:'Y'和200),如果不是隻是將list2中不匹配的列表添加到list1(就像在我所需的輸出中一樣)並保留list1中不匹配的數據(例如:['C', 16, 'F', 50, 60])。 我如何在python 3函數中做到這一點?我想爲此提供一個簡單而直接的功能。非常感謝您的參與!

+0

你試過了什麼嗎?你能告訴我們你做了什麼嗎? – Arount

回答

1

您可使用的功能if陳述適用所有規則。

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

謝謝先生,這正是我需要的! – Rommel

0

這裏有一個辦法做到這一點使用列表理解

lst = [i for x, y in zip(list1, list2) 
      for i in (([*x[:2], y[2], x[3], y[4]],) if x[1] == y[1] else (x, y))] 

print(lst) 
# [['A', 14, 'Y', 10, 200], ['B', 15, 'M', 30, 400], ['C', 16, 'F', 50, 60], ['C', 17, 'G', 0, 600]] 

的匹配情況下,內表的構造使得它稍微不可讀。這將是更可讀的「deflattened」的形式與循環:

def merge_lists(list1, list2): 
    lst = [] 
    for x, y in zip(list1, list2): 
     if x[1] == y[1]: 
      lst.append([*x[:2], y[2], x[3], y[4]]) 
     else: 
      lst.extend((x, y)) 
    return lst 
0

有關兩份名單的工作同時可以使用zip()Docs Here

例如:

for value in zip(list1, list2): 
     print (value[0], value[1]) 

將返回:

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

因此使用拉鍊,你可以工作兩個你的名單在同一時間。

+0

感謝您的提示! – Rommel

0

這裏有一個方法,該列表轉換成一個字典,並採取的事實,即從list2重疊的項目將只覆蓋他們list1同行:

combined_list = list1 + list2 
final_dict = {tuple(i[:2]):tuple(i[2:]) for i in combined_list} 
> {('A', 14): ('Y', 0, 200), 
    ('B', 15): ('M', 0, 400), 
    ('C', 16): ('F', 50, 60), 
    ('C', 17): ('G', 0, 600)} 
merged_list = [list(k) + list (final_dict[k]) for k in final_dict] 
> [['C', 16, 'F', 50, 60], 
    ['B', 15, 'M', 0, 400], 
    ['C', 17, 'G', 0, 600], 
    ['A', 14, 'Y', 0, 200]] 

如果列表的順序是非常重要的,你可以在最後進行排序或使用OrderedDict首先創建合併。

0

你的「加盟」算法可以在每個項目上獨立工作,很簡單:

def join_list(item1, item2): 
    if item1[1] == item2[1]: 
     result = item1[:] 
     result[2] = item2[2] 
     result[4] = item2[4] 
     return (result,) 
    return item1[:], item2[:] 

此函數總是返回元組:獨身在一般情況下平等或夫妻的CAS。

您可以應用此功能的兩個列表list1list2,使用map()功能。但結果將是一個元組列表(實際上在Python 3發電機),所以你需要拼合結果:

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

joined = [x 
      for row in map(join_list, list1, list2) 
      for x in row] 
print(joined) 

你得到你所期望的。