试图系统地从列表中删除元素,但遗漏了一些元素?

时间:2015-06-28 01:46:50

标签: python list python-2.7

我试图创建1000以下的整数列表(也就是0到999),然后删除不符合某个规则的数字[例如,必须可以被7或3整除]。之后,我找到了所有这些数字的总和。下面是我写的代码。

number_list = []

for x in range(1000):
number_list.append(x)

index = 0
element = number_list[index]

max = 1000
deleted = 0

while index < max - deleted:

    element = number_list[index]

    if element % 7 != 0 or element % 3 != 0:
        number_list.remove(element)
        deleted = deleted + 1

    index = index + 1

print(sum(number_list))

这没有任何问题,但它没有返回正确的总和。 正确的总和是214216,但是这给了我261832,让我相信应该删除的40多个元素尚未被删除。

如何解决此问题?

4 个答案:

答案 0 :(得分:3)

这是使用列表推导来实现它的一种方法:

number_list = [i for i in range(1000) if not i % 7 != 0 or not i % 3 != 0 ]
print sum(number_list) #Python2

输出:

214216

答案 1 :(得分:2)

对于此问题,使用列表解析应该更简单。无论如何,我会尝试修复你的实现。

  • 条件element % 7 != 0 or element % 3 != 0应为and 而不是or
  • 如果在循环迭代中删除了某个数字,则index不应移至下一个,因为 next 元素现在位于此index。< / LI>

总结:

if element % 7 != 0 or element % 3 != 0:
    number_list.remove(element)
    deleted = deleted + 1

index = index + 1

应该是:

if element % 7 != 0 and element % 3 != 0:
    number_list.remove(element)
    deleted = deleted + 1
else:
    index = index + 1

答案 2 :(得分:2)

当您从列表中删除元素时:number_list.remove(element),索引的含义会发生变化,以便在下一次迭代中,在递增index后,element = number_list[index]现在引用的值不是index - 原始 number_list的项目。因此,永远不会检查原始number_list中的某些值。

解决方案通常是not mutate a list while iterating over it。相反,使用list comprehension(或者,为了内存效率,generator expression)来构建新列表:

In [107]: sum([i for i in range(1000) if (i % 7 == 0) or (i % 3 == 0)])
Out[107]: 214216

或者向后迭代index ,从999减少到0,这样删除index项就不会影响其他项的索引一个较小的指数。

答案 3 :(得分:0)

一切都更简单。

sum=0
for x in range(1000):
    if x % 7 == 0 or x % 3 == 0:
        sum=sum+x
print sum

结果:

214216