2014-10-02 120 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) 

Ë

相关问题