我有以下代码从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
答案 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))