0

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

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]

它出什么问题了?

4

2 回答 2

0

您正在迭代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)
于 2015-08-05T01:53:52.493 回答
0

我没有尝试过 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)

输出:

('之后:', [3, 5, 6, 7])

于 2015-08-05T02:00:10.123 回答