2012-09-25 60 views
0

我想遍歷兩個列表清單,並避免每個列表的位置1和2之間的值的重複組合。如何循環兩個列表的列表並避免特定位置的值出現重複組合?

a = [[2007, 206, 205, 8], [2007, 206, 208, 9]] 
b = [[2007, 205, 206, 8], [2007, 207, 210, 10]] 

在此情況下爲一個[0],位置1和2將分別是206和205,以及用於B [0],位置1和2將是205和206一個[0]和B [0]來自相同的數據集,但結構不同。但是,基於組合,b [0]將是[0]的副本。我如何避免使用這種基於組合的重複?

謝謝。

+2

Python有一個'set'數據結構,你可能會發現有用。 –

+0

因爲它是一個「重複」,你想在'b [0]中發生什麼? – mgilson

+0

你想做什麼以「避免」重複?用a和b創建一個包含所有非重複記錄的新列表c?刪除a或b中的記錄?在a和b中的所有列表中刪除重複項,或者在相應的位置之間重複項? – Dave

回答

1

如果你想要像一個結果:

c = [[2007, 206, 205, 8], [2007, 206, 208, 9], [2007, 207, 210, 10]] 

這應該是很容易:

a = [[2007, 206, 205, 8], [2007, 206, 208, 9]] 
b = [[2007, 205, 206, 8], [2007, 207, 210, 10]] 
from itertools import chain 
seen = set() 
c = [] 
for lst in chain(a,b): 
    one_two = tuple(lst[:1] + sorted(lst[1:-1]) + lst[-1:]) 
    if one_two not in seen: 
     seen.add(one_two) 
     c.append(lst) 
+0

在我評論它們之前,您一直在解決問題。 :^)但我認爲你需要在密鑰中使用全部四個值;否則你不能區分具有不同開始和結束但是相同中間數字的4元組。 – DSM

+0

@DSM - 是的,我知道。據我瞭解,這是所期望的行爲(否則,中間兩個的特殊意義是什麼?)。你是否在提議類似於:'tuple([lst [0]] + sorted(lst [1:3])+ lst [3])'? – mgilson

+0

嗯。我認爲這只是中間兩個不是按照規範的順序。現在,如果你看到[2012,205,206,8],然後[2007,205,206,9],後者將被壓制。編輯:是的,那正是我的想法。 – DSM

0
sorted_a = [sorted(x) for x in a] 
filtered_b = filter(lambda x: sorted(x) not in sorted_a, b) 
+0

基本上相同的組合在排序後會相同。你可以用整個子列表或其中的一部分來完成。 – swang