遍历数字并评估数字是否可被某些数字整除

时间:2018-10-30 12:38:21

标签: python for-loop division

我写了一个程序来评估某个范围内的哪些数字只能被某些数字(在 <html> <head> <script type="text/javascript"> var request = require('request'); // npm package request request.post( 'http://udmserve.com/udm/radalytics_api.cpx?action=report&api_key=xxx', { json: {"start_date":"2018-10-28","end_date":"2018-10-29", "columns":["paid_impressions","revenue"]} }, function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) } } ); </script> </head> <body> <h1> the rev is: <script type="text/javascript"> document.write(request) </script> </h1> </body> </html> 1范围内)除。到目前为止,代码似乎可以正常工作,但是我在pythontutor http://www.pythontutor.com/visualize.html#mode=edit上测试了它所执行的步骤,并且发生了一些奇怪的事情。

在第二个循环中,代码并不总是检查所有值9的可除性,但有时会忽略最后一个值(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整除的数字。同样在pythontutor上,第二个for循环遍历所有值7

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

1800

输出如下:

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)

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

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

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

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

2 个答案:

答案 0 :(得分:3)

您的问题在这一行:

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

此代码可以改进,但是用于让您了解如何实现

答案 1 :(得分:1)

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

>>> 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整除,因此两个示例列表在删除列表中的值时均出错。