我试图把一个数字列表传递给一个素数函数。我所期待的是,它返回的项目是素数,并丢弃那些不是。
以下是代码:
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我的问题非常基本,但我不明白为什么第一种从现有列表中删除项目的方法不删除所有的非素数?我做错什么了?
发布于 2018-05-25 10:21:33
我将解释在原始代码的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] :
结论:“不要在迭代对象的同时修改对象”将是一个很好的带回家的信息。
发布于 2018-05-25 10:09:47
在迭代时删除项会导致此类错误。
这里的一种方法可以是创建一个包含您选择的约束的新列表:
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]发布于 2018-05-25 10:51:59
在循环中,伦(Num)正在改变!所以我的指针不是重排的。在第一和第二扬声器之后,用于nums[]的扬声器是相同的。更改nums[]的时间是因为nums2 91被删除了!现在nums3不是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]https://stackoverflow.com/questions/50526625
复制相似问题