Python 列表删除

Python list delete

我的程序,我想从列表中删除一些项目:

num_str = input('Enter a number: ')
num_num = int(num_str)

fac_list = list(range(1, num_num + 1))
print("BEFORE: ", fac_list)

for item in fac_list:
    if num_num % item == 0:
        fac_list.remove(item)

print("AFTER: ",fac_list)

输出:

Enter a number: 8
BEFORE:  [1, 2, 3, 4, 5, 6, 7, 8]
AFTER:  [2, 3, 5, 6, 7]

应该是:

[3, 5, 6, 7]

怎么了?

您正在遍历 list 并将其删除,这与您希望的方式不符。这是因为当您迭代列表时,for 循环会跟踪您当前所在的索引,但是当您从列表中删除一个项目时,索引会发生变化,因此您最终可以跳过对某些元素的迭代。

您可以只创建一个包含所需值的新列表(而不是从旧列表中删除),这可以使用列表理解来完成 -

fac_list[:] = [x for x in fac_list if num_num % x != 0:]

左边的切片符号是为了原地做这个,所以fac_list就地改变了。

如果你想删除(而不是创建一个新列表),你应该遍历它的副本,示例 -

for item in fac_list[:]:
    if num_num % item == 0:
        fac_list.remove(item)

我没有尝试过 Anand S Kumar 的解决方案,但是您可以向后遍历它,而不是生成一个新列表,这样当您删除项目时,它不会影响您将遍历的索引。

num_str = input('Enter a number: ')
num_num = int(num_str)

fac_list = list(range(1, num_num + 1))
print("BEFORE: ", fac_list)

for i in range(len(fac_list)-1, -1, -1): # Iterate backwards instead
    item = fac_list[i]
    if num_num % item == 0:
        fac_list.remove(item)

print("AFTER: ",fac_list)

输出:

('AFTER: ', [3, 5, 6, 7])