如何在python中删除列表的成员

时间:2018-04-17 12:34:28

标签: python set

我有以下代码从data列表中删除nums为子集的所有子列表。我不明白为什么它不起作用:

data=[[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
nums=[1,2]

for each in data:
    if set(nums).issubset(each):
        data.remove(each)

print(data)
>>[[1, 2, 4], [1, 3, 4], [2, 3, 4]]

当nums是其子集时,为什么不删除[1,2,4]?如下所示?

set(nums).issubset([1,2,4])
>>True

3 个答案:

答案 0 :(得分:9)

您正在修改您正在迭代的列表。

这是一个更好的解决方案:

data=[[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
nums=[1,2]

data = [each for each in data if not set(nums).issubset(each)]
print(data)

出于学习目的,请参阅此代码也可以使用。与您的代码的不同之处在于,我们不会在data循环中修改for列表。

data=[[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
nums=[1,2]

new_data = []
for each in data:
    if not set(nums).issubset(each):
        new_data.append(each)

data = new_data
print(data)

答案 1 :(得分:1)

因为迭代器不知道你删除了一个元素。当它传递给第二个元素时,它会找到[1, 3, 4],这意味着您跳过了[1, 2, 4]

答案 2 :(得分:1)

为了您的信息,在非常有用的itertools模块中还有一个filterfalse函数。

from itertools import filterfalse

data = list(filterfalse(set(nums).issubset, data))