循环数字并评估数字是否可以被某些数字整除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环数字并评估数字是否可以被某些数字整除相关的知识,希望对你有一定的参考价值。

我写了一个程序来评估某个范围内的数字只能被某些数字分割(在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]

它应该是它的输出,如第二个列表中只有57可以分割的数字。同样在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正在做它的功能。

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

答案

不要从您迭代的列表中删除项目,正如另一个答案所述。更改列表的长度会影响迭代。例:

>>> 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]

如果你还没有看过for/else,那么else只会在你没有从for循环中断开的情况下执行,所以所有的k % w != 0都必须是真的。

另一种选择是使用list comprehensions,它真正简化了代码:

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]

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

另一答案

你的问题在于这一行:

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

这段代码可以改进,但是让你了解如何做到这一点

以上是关于循环数字并评估数字是否可以被某些数字整除的主要内容,如果未能解决你的问题,请参考以下文章

打印出用户输入和条件之间可以被 2 和 3 整除的所有数字。while 循环要求另一个数字

判断任意数字是否为素数

如何检查数字是不是可以被另一个Python整除

排列一个整数数组,使得没有两个连续数字的总和可以被 3 整除

如何在C#中检查数字是不是可以被另一个数字整除而没有条件检查(如果,三进制等)

质数判断结构