簡體   English   中英

Python根據第一個或第二個值從列表列表中刪除匹配項

[英]Python remove matches from list of list based on first and or second values

我有以下列表,我需要刪除第一個或第二個值與其他任何第一個或第二個值匹配的條目。 請參見以下示例,並更正輸出。

集合:

+       [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和2的第一個位置中的“ 1”匹配“ 1”,而在對1和3的第二個位置中的“ 12”匹配“ 12”。

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

之所以有效,是因為沒有第一個值等於任何其他第一值,並且沒有第二個值等於任何其他第二值。

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

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

我已經呆了幾個小時了。

使用列表理解:

>>> [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) )進行zip(*i)並使用set( 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)

我初始化了一個變量以模擬正確的數據。 如果我了解您的要求,則下面的代碼可能會起作用。

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)

Ë

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM