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

How to remove numbers from an existing list that arent prime

我正在尝试将数字列表传递给素数函数。我期望它 return 是质数的项目并丢弃那些不是质数的项目。

代码如下:

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

我的问题很基础,但我不明白为什么第一种从现有列表中删除项目的方法没有删除所有非素数?我做错了什么?

在遍历项目时删除项目会导致此类错误。

此处的一种方法是使用您选择的约束创建一个新列表:

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]

我向您解释在原始代码的 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]

结论:"Do not modify an object while iterating over it" 将是很好的带回家的信息。

在循环中 len(nums) 正在改变!所以指针 i 不正确。在 nums[] 的第一次和第二次循环之后是相同的。这 第三次 nums[] 被改变,因为 nums[2] 91 被删除了!现在 nums[3] 不是 32 而是 92 并且 92 是 deleten instent 32 you exept.

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]