使用列表理解就地更新列表:
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']]
为什么跳过'i'中的第0个元素? – IanAuld
@IanAuld:来自问题:*并且它不在该嵌套列表的第一个位置* –
您可以添加预期的输出吗?我并不完全明白,如果它不在嵌套列表的第一个位置,你似乎忽略了Martjin答案中的所有第一个元素 –