2017-11-11 145 views
0

我有一個這樣的名單[1]:刪除從列表子表,如果它包含給定元素

[['a1', 'b1', 'c1'], ['a1', 'b1', 'c2'], ['a1', 'b1', 'c3'], 
['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
['a2', 'b2', 'c1'], ['a2', 'b2', 'c2'], ['a2', 'b2', 'c3'], 
['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']] 

而且一個這樣的[2]:

[['a1', 'b1'], ['a2', 'b2']] 

而且我想刪除子表[1]其中包含[2]的任何子列表中的所有元素。換句話說,如果[1]的子列表包含'a1' and 'b1''a2' and 'b2',則應刪除它(僅用於完全匹配字符串)。

列表[1]應該是這樣的:

[['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']] 

我已經嘗試了類似的方法是:

https://stackoverflow.com/a/17934810/6278576

但是,我想不出如何適應它在滿足幾個條件時從列表中刪除子列表。

這怎麼辦?

回答

0

您可以使用一個函數來篩選第二個列表中每個項目組的列表。

def filterall(list_in, *filter_iterables): 
    out = list_in.copy() 
    for it in filter_iterables: 
     out = [x for x in out if not all(i in x for i in it)] 
    return out 

x = [['a1', 'b1', 'c1'], ['a1', 'b1', 'c2'], ['a1', 'b1', 'c3'], 
['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
['a2', 'b2', 'c1'], ['a2', 'b2', 'c2'], ['a2', 'b2', 'c3'], 
['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']] 

filterall(x, ['a1', 'b1'], ['a2', 'b2']) 
# returns: 
[['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']] 
0

您仍然可以使用列表理解,只是窩謂詞:

list1 = [['a1', 'b1', 'c1'], ['a1', 'b1', 'c2'], ['a1', 'b1', 'c3'], 
     ['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
     ['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
     ['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
     ['a2', 'b2', 'c1'], ['a2', 'b2', 'c2'], ['a2', 'b2', 'c3'], 
     ['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
     ['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
     ['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
     ['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']] 
list2 = [['a1', 'b1'], ['a2', 'b2']] 

print [sublist1 for sublist1 in list1 if not any([all([item2 in sublist1 for item2 in sublist2]) for sublist2 in list2])] 

打印對我來說:

[['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], 
['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], 
['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], 
['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], 
['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], 
['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], 
['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']] 

如果你想在更大的數據運行這個(即很長列表),你可能想要將你的列表變成集合以允許更快的交集。

0

filter + lambda + all組合

l1 = [['a1', 'b1', 'c1'], ['a1', 'b1', 'c2'], ['a1', 'b1', 'c3'], ['a1', 'b2', 'c1'], ['a1', 'b2', 'c2'], ['a1', 'b2', 'c3'], ['a1', 'b3', 'c1'], ['a1', 'b3', 'c2'], ['a1', 'b3', 'c3'], ['a2', 'b1', 'c1'], ['a2', 'b1', 'c2'], ['a2', 'b1', 'c3'], ['a2', 'b2', 'c1'], ['a2', 'b2', 'c2'], ['a2', 'b2', 'c3'], ['a2', 'b3', 'c1'], ['a2', 'b3', 'c2'], ['a2', 'b3', 'c3'], ['a3', 'b1', 'c1'], ['a3', 'b1', 'c2'], ['a3', 'b1', 'c3'], ['a3', 'b2', 'c1'], ['a3', 'b2', 'c2'], ['a3', 'b2', 'c3'], ['a3', 'b3', 'c1'], ['a3', 'b3', 'c2'], ['a3', 'b3', 'c3']] 
l2 = [['a1', 'b1'], ['a2', 'b2']] 
list(filter(lambda x: all(not all(j in x for j in i) for i in l2), l1)) 

輸出:

[['a1', 'b2', 'c1'], 
['a1', 'b2', 'c2'], 
['a1', 'b2', 'c3'], 
['a1', 'b3', 'c1'], 
['a1', 'b3', 'c2'], 
['a1', 'b3', 'c3'], 
['a2', 'b1', 'c1'], 
['a2', 'b1', 'c2'], 
['a2', 'b1', 'c3'], 
['a2', 'b3', 'c1'], 
['a2', 'b3', 'c2'], 
['a2', 'b3', 'c3'], 
['a3', 'b1', 'c1'], 
['a3', 'b1', 'c2'], 
['a3', 'b1', 'c3'], 
['a3', 'b2', 'c1'], 
['a3', 'b2', 'c2'], 
['a3', 'b2', 'c3'], 
['a3', 'b3', 'c1'], 
['a3', 'b3', 'c2'], 
['a3', 'b3', 'c3']] 
0

那麼你可以很容易地做到這一點與嵌套循環......但我的猜測是,你的老師正試圖使你認爲如何優化它。

我會對每個數組進行排序。首先包含字符串,然後是包含數組的頂層數組。

這樣,任務變爲m.log(n),其中m是第二個數組的大小,n是第一個數組的大小。

這對你有意義嗎?