我试图将数字列表传递给素数函数。我所期望的是它返回素数的项目并丢弃那些不是。
以下是代码:
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
我的问题非常基本,但我无法弄清楚为什么从现有列表中删除项目的第一种方法不会删除所有非素数?我做错了什么?
答案 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
循环的每次迭代中执行的操作:
nums = [31, 71, 32, 92, 13, 73, 14, 34, 74]
nums = [31, 71, 32, 13, 73, 14, 34, 74]
nums = [31, 71, 32, 13, 73, 34, 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]