首页 > 解决方案 > 遍历数字并评估数字是否可以被某些数字整除

问题描述

我编写了一个程序来评估某个范围内的哪些数字只能被某些数字整除(在 到 的范围内19。到目前为止,代码似乎有效,但我在 pythontutor http://www.pythontutor.com/visualize.html#mode=edit测试了它所采取的步骤,并且发生了一些奇怪的事情。

在第二个循环中,代码并不总是检查所有值(k)的可分性,但有时会忽略最后一个值(k)。最好给你一个例子:

Liste = []
for i in range (1500, 1700):
    if i%5 == 0 and i%7 == 0:
        Liste.append(i)
print (Liste)

Teiler = [2, 3, 4, 6, 8, 9]
for k in Liste:
    z = 0
    for w in range (len(Teiler)):
        if k%Teiler[z] == 0:
            Liste.remove(k)
            z += 1
            break
        else:
            z += 1

print (Liste)

这里的输出如下:

[1505, 1540, 1575, 1610, 1645, 1680]

[1505, 1575, 1645]

并且它应该是它的输出,如第二个列表中只有可被5and整除的数字7。同样在 pythontutor 上,第二个 for 循环遍历所有值(k)

但是当我像下面这样更改数字范围时(第 2 行,将范围从 更改17001800):

Liste = []
for i in range (1500, 1800):
    if i%5 == 0 and i%7 == 0:
        Liste.append(i)
print (Liste)

Teiler = [2, 3, 4, 6, 8, 9]
for k in Liste:
    z = 0
    for w in range (len(Teiler)):
        if k%Teiler[z] == 0:
            Liste.remove(k)
            z += 1
            break
        else:
            z += 1

print (Liste)

输出如下:

[1505, 1540, 1575, 1610, 1645, 1680, 1715, 1750, 1785]

[1505, 1575, 1645, 1715, 1785]

如果我在 pythontutor 上运行此代码,则代码将停在k = 1750并且不检查k = 1785.

为什么会这样?是不是对pythontutor的检查有问题?还是我的代码有问题?

我想了解为什么 Python 正在做它所做的事情。

非常感谢您的帮助。如果这是一个菜鸟问题,或者我错过了一些明显的东西,我很抱歉。

标签: pythonfor-loopdivision

解决方案


您的问题出在这一行:

Liste.remove(k)

因为您要从用于 for 循环的同一列表中删除元素,所以当您删除一个元素时,列表会更短,但下一次迭代您将跳转一个元素。

我建议使用两个列表或使用 while 循环,当您从列表中删除元素时,您不会进行下一次迭代,而是减少 1 列表的 len;例子:

Liste = []
for i in range (1500, 1800):
    if i%5 == 0 and i%7 == 0:
        Liste.append(i)
print (Liste)

Teiler = [2, 3, 4, 6, 8, 9]

l=len(Liste)
i=0
while i<l:
    k=Liste[i]
    z = 0
    for w in range (len(Teiler)):
        if k%Teiler[z] == 0:
            Liste.remove(k)
            l-=1
            i-=1
            z += 1
            break
        else:
            z += 1
    i+=1

此代码可以改进,但用于让您了解如何做到这一点


推荐阅读