2016-05-29 199 views
-1

可以說我有一個列表:蟒蛇從嵌套列表中刪除元素+

A = ['x', 'y', 'z'] 

,另一個 - 嵌套:

B = [['x', 'a', 'b', 'c'], ['y', 'c'], ['x', 'a', 'c', 'z']] 

我怎麼能去掉「Z」從列表B中的最後一個子列表中,知道'z'在A中,子列表B中的每個第一個元素[0]都在列表A中?

所以基本上我需要從這樣的嵌套列表中刪除所有元素,其中元素是在A,並且它不在該嵌套列表的第一個位置?

我想這一點,但得到堆疊:

for i in B: 
    for j in i[1:]: 
     if j in A: 
      del j 

,但我失去了一些東西。

+0

爲什麼跳過'i'中的第0個元素? – IanAuld

+0

@IanAuld:來自問題:*並且它不在該嵌套列表的第一個位置* –

+0

您可以添加預期的輸出嗎?我並不完全明白,如果它不在嵌套列表的第一個位置,你似乎忽略了Martjin答案中的所有第一個元素 –

回答

1

使用列表理解就地更新列表:

for sublist in B: 
    if sublist[0] in A: 
     sublist[1:] = [v for v in sublist[1:] if v not in A] 

j在你的循環只是另一個參考子表的值。 del j刪除那個引用,但該列表仍包含該引用。您可以使用del listobj[index]listobj.pop(value)(請注意這些內容中的細節)從列表中刪除值,但在迭代時從列表中刪除將導致跳過項目,如果您不小心。

通過分配給一個切片,您可以在就地替換列表中的這些元素。

請注意,您可能想要製作A a 集合;會員測試是遠遠快使用一組時:

Aset = set(A) 

for sublist in B: 
    if sublist[0] in Aset: 
     sublist[1:] = [v for v in sublist[1:] if v not in Aset] 

演示:

>>> A = ['x', 'y', 'z'] 
>>> B = [['x', 'a', 'b', 'c'], ['y', 'c'], ['x', 'a', 'c', 'z']] 
>>> Aset = set(A) 
>>> for sublist in B: 
...  if sublist[0] in Aset: 
...   sublist[1:] = [v for v in sublist[1:] if v not in Aset] 
... 
>>> B 
[['x', 'a', 'b', 'c'], ['y', 'c'], ['x', 'a', 'c']] 
+0

謝謝,非常感謝。 A已經是一個集合,但我再次修改它以列出(A),因爲我認爲玩這兩個列表會很容易。 – JanM

1

您可以使用嵌套列表理解:

>>> [sub[:1]+[i for i in sub[1:] if not(sub[0] in A and i in A)] for sub in B] 
[['x', 'a', 'b', 'c'], ['y', 'c'], ['x', 'a', 'c']] 

這裏,你會保持從子列表中的項目(從第二項到結束)不符合刪除條件。

+0

是的,你可以,但在這裏我不會。 '不是(A中的sub [0]和A中的我)'不是完全滾動的舌頭。 –

+0

@MartijnPieter也許吧,但是在腳本中使用雙重否定排除有時候很酷:-)。 – Kasramvd