2014-10-02 130 views
-1

我有以下列表,並且需要刪除第一個或第二個值與任何其他第一個或第二個值匹配的任何條目。請參閱下面的示例以及正確的輸出。Python根據第一個或第二個值從列表中刪除匹配

設定:

+  [0] (['1', '12'], ['1', '8'], ['12', '12']) tuple 
+  [1] (['1', '12'], ['1', '8'], ['12', '8']) tuple 
+  [2] (['1', '12'], ['1', '8'], ['12', '0']) tuple 
+  [3] (['1', '12'], ['1', '8'], ['15', '0']) tuple 
+  [4] (['1', '12'], ['12', '12'], ['12', '8']) tuple 
+  [5] (['1', '12'], ['12', '12'], ['12', '0']) tuple 
+  [6] (['1', '12'], ['12', '12'], ['15', '0']) tuple 
+  [7] (['1', '12'], ['12', '8'], ['12', '0']) tuple 
+  [8] (['1', '12'], ['12', '8'], ['15', '0']) tuple 
+  [9] (['1', '12'], ['12', '0'], ['15', '0']) tuple 
+  [10] (['1', '8'], ['12', '12'], ['12', '8']) tuple 
+  [11] (['1', '8'], ['12', '12'], ['12', '0']) tuple 
+  [12] (['1', '8'], ['12', '12'], ['15', '0']) tuple 
+  [13] (['1', '8'], ['12', '8'], ['12', '0']) tuple 
+  [14] (['1', '8'], ['12', '8'], ['15', '0']) tuple 
+  [15] (['1', '8'], ['12', '0'], ['15', '0']) tuple 
+  [16] (['12', '12'], ['12', '8'], ['12', '0']) tuple 
+  [17] (['12', '12'], ['12', '8'], ['15', '0']) tuple 
+  [18] (['12', '12'], ['12', '0'], ['15', '0']) tuple 
+  [19] (['12', '8'], ['12', '0'], ['15', '0']) tuple 

例如:

+  [0] (['1', '12'], ['1', '8'], ['12', '12']) tuple 

不起作用,因爲 '1' 中對一個和兩個的第一位置匹配 '1' 和 '12' 的匹配「12」中對1的第二位置和3

+  [12] (['1', '8'], ['12', '12'], ['15', '0']) tuple 

作品因爲沒有第一值等於任何其它的第一值和第二無值等於任何其他第二個值。

需要的結果列表(或任何數據類型是最合適的)是:

+  [12] (['1', '8'], ['12', '12'], ['15', '0']) tuple 
+  [8] (['1', '12'], ['12', '8'], ['15', '0']) tuple 

我在和卡一兩個小時。

+0

... ...並不是一個列表? – 2014-10-02 21:34:27

+0

這是從temp = list(itertools.combinations(match,V)) 這是不是一個列表? – user3552459 2014-10-02 21:37:44

+0

@ user3552459您對該「列表」的格式是非標準的。它看起來不像來自'list(itertools.combinations(a,b))'的任何輸出。你在使用一些IDE嗎?如果你爲'match'和'V'指定值,這可能會有所幫助。 – John1024 2014-10-02 21:47:21

回答

2

使用列表理解:

>>> [i for i in l if all([len(set(k))==3 for k in zip(*i)])] 
[(['1', '12'], ['12', '8'], ['15', '0']), (['1', '8'], ['12', '12'], ['15', '0'])] 

,如果你也想的索引,使用enumerate

>>> [j for j,i in enumerate(l) if all([len(set(k))==3 for k in zip(*i)])] 
[8, 12] 

對於列表中的每個項目,你壓縮的元組(zip(*i)),並檢查是否所有這些項目是不同的使用集(len(set(k)==3?)。

上的項0和8:

>>> zip(*l[0]) 
[('1', '1', '12'), ('12', '8', '12')] 
>>> [len(set(k)) for k in zip(*l[0])] 
[2, 2] 
>>> zip(*l[8]) 
[('1', '12', '15'), ('12', '8', '0')] 
>>> [len(set(k)) for k in zip(*l[8])] 
[3, 3] 

然後all檢查,在這個列表中的所有產品True,那就是==3

>>> [len(set(k))==3 for k in zip(*l[0])] 
[False, False] 
>>> all([len(set(k))==3 for k in zip(*l[0])]) 
False 
>>> [len(set(k))==3 for k in zip(*l[8])] 
[True, True] 
>>> all([len(set(k))==3 for k in zip(*l[8])]) 
True 

如果你不想硬編碼==3,您可以使用==len(k)

+0

好的工作和很酷的技巧! – user3885927 2014-10-02 23:01:02

+0

真棒!非常感謝。從中學到很多東西。 – user3552459 2014-10-02 23:41:13

0

我初始化的變量來模擬正確的數據。 如果我明白你想要什麼,下面的代碼可能工作。

a = [(['1', '12'], ['1', '8'], ['12', '12']), (['1', '12'], ['1', '8'], ['12', '8']) , (['1', '12'], ['12', '8'], ['15', '0'])] 
len1 = len(a) 
len2 = len1 - 1 
while(len1 != len2) : 
    len1 = len(a) 
    for i in a : 
     test1 = (i[0][0] == i[1][0]) or (i[2][0] == i[1][0]) or (i[0][0] == i[2][0]) 
     test2 = (i[0][1] == i[1][1]) or (i[2][1] == i[1][1]) or (i[0][1] == i[2][1]) 
     if (test1 or test2) : 
      a.remove(i) 
     len2 = len(a) 
print(a) 

Ë

相關問題