2016-08-18 77 views
1

我正在對數據庫運行兩個查詢,每個查詢得到的結果都是完美的元組列表。我想將這些加入到一個元組列表中。這些都是元組的例子:如何連接兩個不重複的元組列表

list1 = [('abc', 1), ('def', 2) ... ] 
list2 = [(1000, 'abc'), (2000, 'def'), (3000, 'def') ... ] 

我想創建只是一個元組的列表,我加入他們這樣的:

q = [] 
for i in list1: 
      for j in list2:   
       if i[0] == (j[1]): 
        i = i + (j[0],) 
        q.append(i) 

這將返回我的新名單q重複的,因爲我得到的東西像這樣的:

q = [('abc', 1 , 1000) , ('def', 2, 2000), ('def', 2, 2000, 3000) ...] 

我如何才能避免重複一樣的q列表元組的第二個列表? 我只想要('def', 2, 2000, 3000)而不是這個('def', 2, 2000), ('def', 2, 2000, 3000)

我一直堅持這一段時間,所以任何幫助表示讚賞。謝謝

+0

如果列表很大,對此使用嵌套循環並不是一個好主意。請參閱下面的進一步細節。 –

回答

5

如果您的列表相當小,但對於較大的列表很快就會變得效率低下,那麼使用嵌套循環是可以的。例如,如果len(list1)== 10和len(list2)== 20,則內部循環內的代碼將執行200次。

這是一個算法,它通過字典構建所需的元組列表。字典將元組數據存儲在列表中,因爲它更高效:可以附加到列表,而元組是不可變的,所以每次將元素添加到元組的末尾時,實際上都會創建一個新的元組對象(以及臨時的(j[0],)元組),並丟棄綁定到i的舊的元組。

list1 = [('abc', 1), ('def', 2), ('ghi', 3)] 
list2 = [ 
    (1000, 'abc'), 
    (2000, 'def'), 
    (2100, 'def'), 
    (3000, 'ghi'), 
    (3100, 'ghi'), 
    (3200, 'ghi'), 
] 

# Insert list1 data into a dict of lists 
d = {t[0]:list(t) for t in list1} 

# Append list2 data to the correct list 
for v, k in list2: 
    d[k].append(v) 

# Convert lists back into tuples, using the key order from list1 
result = [tuple(d[k]) for k, _ in list1] 
for t in result: 
    print(t) 

輸出

('abc', 1, 1000) 
('def', 2, 2000, 2100) 
('ghi', 3, 3000, 3100, 3200) 

在此算法中,如果len(list1的)== 10和len(列表2)== 20則有長度10的環來構建字典d ,一個長度爲20的循環,用於將列表2的數據附加到d的列表中,另一個長度爲10的循環用於構建元組的最終列表。他步入每個循環都是相當基本的,大致與你的i = i + (j[0],)相當,顯然40步比200好很多。當然,如果輸入列表每個有1000個項目,那麼我的代碼將需要3000循環,而使用嵌套循環方法需要100萬個循環。

我還應該提到,如果list2包含的密鑰不在list1中,則此代碼將提高KeyError。據推測,這不是你正在處理的數據的問題,因爲你的代碼(和Sevanteri's)默默地忽略了這些鍵。如果您要需要處理這樣的密鑰,那麼這樣做相當簡單,但如果它不必處理丟失的密鑰,那麼它會使我的list2迴路簡單&更高效。

+0

感謝您的詳細回覆。目前的名單大小隻有20,但未來會增長,這是一個更好的長期選擇 – johnfk3

0

你不需要在內部循環內附加i。只是在外部循環的末尾。

q = [] 
for i in list1: 
    for j in list2: 
     if i[0] == j[1]: 
      i = i + (j[0],) 
    q.append(i) 

外環中還有一個錯字。應該是list1而不是list

+0

謝謝你我編輯錯字,它完美的作品! – johnfk3

+0

你可以在'(j [1])'周圍刪除paren。它不是一個元組,而是一個簡單的值。 –

+0

@LaurentLAPORTE啊,真的。甚至沒有注意到一個。 :D – Sevanteri

相關問題