我试图创建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多个元素尚未被删除。
如何解决此问题?
答案 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