Python 通过数字循环并计算数字是否可被某些数字整除

Python 通过数字循环并计算数字是否可被某些数字整除,python,for-loop,division,Python,For Loop,Division,我编写了一个程序来评估特定范围内哪些数字只能被特定数字整除(范围1到9)。到目前为止,代码似乎工作正常,但我在pythontutor测试了它所采取的步骤,然后发生了一些奇怪的事情 在第二个循环中,代码并不总是检查所有值(k)的可整除性,但有时会遗漏最后一个值(k)。 最好给你举个例子: Liste = [] for i in range (1500, 1700): if i%5 == 0 and i%7 == 0: Liste.append(i) print (Liste

我编写了一个程序来评估特定范围内哪些数字只能被特定数字整除(范围
1
9
)。到目前为止,代码似乎工作正常,但我在pythontutor测试了它所采取的步骤,然后发生了一些奇怪的事情

在第二个循环中,代码并不总是检查所有值
(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]
它的输出应该是,如在第二个列表中,只有可被
5
7
整除的数字。同样在pythontutor上,第二个for循环通过所有值
(k)

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

输出如下所示:

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

[1505, 1575, 1645, 1715, 1785]
如果我在pythontutor上运行此代码,代码将在
k=1750
处停止,并且不会检查
k=1785

为什么会这样? 检查蟒蛇有问题吗? 还是我的代码有问题

我想了解Python为什么要这么做


非常感谢你的帮助。我很抱歉,如果这是一个noob问题或者我遗漏了一些明显的东西

您的问题在这一行:

Liste.remove(k)
因为您正在从用于for循环的同一列表中删除元素,所以当您删除一个元素时,该列表将变短,但下一次迭代将跳过一个元素

我建议使用两个列表或者使用一个while循环,当您从列表中删除元素时,您不会进入下一个迭代,并且您将列表的len减少为1;例如:

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
Liste=[]
对于范围内的i(1500、1800):
如果i%5==0和i%7==0:
Liste.append(i)
打印(列表)
泰勒=[2,3,4,6,8,9]
l=len(列表)
i=0

当i时,不要从您迭代的列表中删除项目,正如其他答案所述。更改列表的长度会影响迭代。例如:

>>> L=list(range(10))
>>> for i in L:
...   if i==5: L.remove(i)
...   print(i)
...
0
1
2
3
4
5  # removed 5, and skipped 6!
7
8
9
另外,
w
从未使用过,尽管
z
是等效的。相反,直接在
Teiler
上迭代,如果满足您的条件,则将项目添加到新列表中:

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

Liste2 = []
Teiler = [2, 3, 4, 6, 8, 9]
for k in Liste:
    for w in Teiler:
        if k % w == 0:
            break
    else:
        Liste2.append(k)

print(Liste2)
输出:

[1505, 1645, 1715]
[1505, 1645, 1715]
如果您没有看到
for/else
else
仅在您没有中断
for
循环时执行,因此所有
k%w!=0必须为真

另一个选项是使用,这确实简化了代码:

L = [i for i in range(1500,1800) if i%5 == 0 and i%7 == 0]
L = [x for x in L if all(x % k != 0 for k in (2,3,4,6,8,9))]
print(L)
输出:

[1505, 1645, 1715]
[1505, 1645, 1715]

注:1575和1785可被3整除,因此您的两个样本列表在删除列表中的值时都有错误。

Ah您的意思是,当选中并删除列表中的一个数字时,列表中原始的下一个数字将取代删除的数字,因此将从迭代中删除。是;)所以,当您希望从正在迭代的同一列表中删除元素时,请小心;)非常感谢你的回答!