2016-05-29 129 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