我在这里的While循环怎么了?

时间:2019-04-21 14:49:21

标签: python

我收到一条错误消息,提示“ IndexError:列表索引超出范围” 与我正在使用的While循环。请帮助。

from array import *

limit = 20
limitn = limit+1
p = 2
nums = range(p,limitn)
primes = []

while p < limitn+1: 
    for i in nums:
        if i == p:
           primes.append(i)
        if i%p == 0:
           nums.remove(i)
    p = nums[0]


print primes    

2 个答案:

答案 0 :(得分:1)

您的列表没有索引,因为在最后一次迭代中nums的长度为0,即列表为空,并且您正在引用第一个元素。
因为您处于for循环中,nums.remove(index)会删除索引,但不会更新列表。
因此,nums仍然引用前一个nums,并且其长度已更改。
因此,请使用切片:

来代替.remove()
nums = nums[: nums.index(i)] + nums[nums.index(i) + 1 :]

slice运算符创建一个新的nums,删除元素i
您找到素数的程序不是一个好方法

for i in range(p, limitn):
     for j in range(2, i):
          if i % j == 0:
                break
     else:
          primes.append(i)

上面的代码将为您提供范围内的质数。  如果有任何可以改进的地方,请发表评论

答案 1 :(得分:0)

使用nums.remove(i)nums将是[]
因此,IndexError: List index out of range没问题

from array import *

limit = 20
limitn = limit+1
p = 2
nums = range(p,limitn)

primes = []

while p < limitn+1: 
    for i in nums:
        if i == p:
           primes.append(i)
        if i%p == 0:
           print(i)
           nums.remove(i)

    # Check nums array size
    if len(nums) == 0:
        break
    p = nums[0]


print primes