如何从现有列表中删除不是素数的数字

时间:2018-05-25 10:04:49

标签: python primes

我试图将数字列表传递给素数函数。我所期望的是它返回素数的项目并丢弃那些不是。

以下是代码:

def primality(num):
    if num % 2 == 0 and num > 2:
        return False
    return all(num % i for i in range(3, int(math.sqrt(num)) + 1, 2))

不起作用,为什么?

nums = [31, 71, 91, 32, 92, 13, 73, 14, 34, 74]
for i, s in enumerate(nums):
    if not primality(nums[i]):
        del nums[i]
print(nums) # it prints [31, 71, 32, 13, 73, 34] which is wrong, 32 and 34 shouldnt be there

但这有效:

temp = []
for i, s in enumerate(nums):
    if not primality(nums[i]):
        continue
    temp.append(s)
print(temp) # [31, 71, 13, 73] which is correct

我的问题非常基本,但我无法弄清楚为什么从现有列表中删除项目的第一种方法不会删除所有非素数?我做错了什么?

3 个答案:

答案 0 :(得分:0)

在迭代它时删除项会导致这种错误。

这里的一种方法可能是使用您选择的约束创建一个新列表:

nums = [31, 71, 91, 32, 92, 13, 73, 14, 34, 74]
prims = [n for n in nums if primality(n)]
# returns : [31, 71, 13, 73]

答案 1 :(得分:0)

我向您解释在原始代码的for循环的每次迭代中执行的操作:

  • 迭代1:i = 0,s = 31:nums不变
  • 迭代2:i = 1,s = 71:nums不变
  • 迭代3:i = 2,s = 91:nums被改变
                                 ==> “91”被移除,因此下一个元素被左移                              ==> nums = [31, 71, 32, 92, 13, 73, 14, 34, 74]
  • 迭代4:i = 3,s = 92 :nums已更改
                                    ==> “92”被移除,因此下一个元素被左移                                 ==> nums = [31, 71, 32, 13, 73, 14, 34, 74]
  • 迭代5:i = 4,s = 73 :nums不变
  • 迭代6:i = 5,s = 14 :nums被更改为
                                    ==> “14”被移除,因此下一个元素被左移                                 ==> nums = [31, 71, 32, 13, 73, 34, 74]
  • 迭代7:i = 6,s = 74 :nums被更改
                                    ==>删除“74”                                 ==> nums = [31, 71, 32, 13, 73, 34]

所以最后你有:nums = [31, 71, 32, 13, 73, 34]

结论:“迭代时不要修改对象”将是一个很好的实用信息。

答案 2 :(得分:-1)

在循环len(nums)正在改变!所以指针i不是核心。在nums []的第一个和第二个loup之后是相同的。该 因为nums [2] 91被删除了!现在 nums [3]不是32但是92和92是删除的内容32你执行。

nums = [31, 71, 91, 32, 92, 13, 73, 14, 34, 74] // del i[2] = 91
nums = [31, 71, 32, 92, 13, 73, 14, 34, 74]     // del i[3] = 92
nums = [31, 71, 32, 13, 73, 14, 34, 74]         // del i[4] = 73 
nums = [31, 71, 32, 13, 73, 14, 34, 74]