2016-09-06 201 views
0

我有兩個列表。第一是由格式化列表如下:Python:兩個列表中的匹配列表

listInA = [id, a1, a2, a3] 

第二組成類似格式的列表,與該ID第一:

listInB = [id, b1, b2, b3] 

既不列表進行排序,並且它們是相等長度的不。是什麼力量讓一個列表的列表的最佳方式,用格式的每一個列表:

listInC = [id, a1, a2, a3, b1, b2, b3] 

,其中ID是兩個列表之間是否匹配?謝謝!

回答

3

您可以使用詞典理解從ID列表的第二個列表中創建一個詞典。然後,使用列表理解創建新列表,並根據ID附加列表。

listA = [ 
    [1, 'a', 'b', 'c'], 
    [2, 'd', 'e', 'f'], 
] 
listB = [ 
    [2, 'u', 'v', 'w'], 
    [1, 'x', 'y', 'z'], 
] 

b_map = {b[0]: b for b in listB} 
print([a + b_map[a[0]][1:] for a in listA]) 

輸出:

[ 
    [1, 'a', 'b', 'c', 'x', 'y', 'z'], 
    [2, 'd', 'e', 'f', 'u', 'v', 'w'] 
] 
0

該列表不排序,並且不相等的長度增加想出一種有效的解決問題的難度的事實。然而,一個快速而骯髒的解決方案最終還是可行的。

ID似乎是兩個列表中的第一個。既然是這樣的話,那麼對於a中的每一個列表,我們都可以得到a的第一個元素,並檢查B中的列表b。如果第一個元素匹配,那麼我們可以創建一個包含ab的其餘元素的列表,並將其附加到C。總之...

def foo(A, B): 
    C = [] 
    for a in A: 
     aID = a[0] 
     for b in B: 
     if aID == b[0]: 
      c = [aID, a[1], a[2], a[3], b[1], b[2], b[3]] 
      C.append(c) 
    return C 

當大名單尺寸AB處理,該解決方案的效率會下降得可憐,但是它應該合理規模的名單運作。