身份:小白
在python学习过程中,学到求100以内质数的时候,碰到一个小问题,求大神指点一下下
a = []
b = []
for i in range(2, 101):
a.append(i)
for j in range(2, i):
if i % j == 0:
b.append(i)
break
在我把“20以内所有元素生成列表a,20以内除1与其本身之外还有其他因数的元素生成列表b”后,接下来:
for循环a列表,如果元素也在b中,就在a列表中移除该元素,打印a列表,最后的结果却是错的:
for i in a:
if i in b:
a.remove(i)
print(a)
# 结果:[2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
而for循环b列表,如果元素也在a中,就在a列表中移除该元素,打印a列表,最后的结果才正确:
for i in b:
if i in a:
a.remove(i)
print(a)
# 结果:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
这是为什么呢?想了半天没想明白,是不是进入哪个误区了啊?/(ㄒoㄒ)/~~
首先,你要理解遍历的概念,比如 [1,2,3,4,5]
遍历的时候,他正常来说是 1,2,3,4,5,但这个其实是不准确的,完整的理解是 [0],即第一个元素,[1],[2],[3],[4]
当遍历列表是,你删除了一个元素,则后续元素向前移动了
arr = [1,2,3,4,5]
for i in arr:
arr.remove(i)
print(arr)
arr[0],被删除,再次遍历时,寻找arr[1],而列表已变成 [2,3,4,5],这个时候删除 arr[1],变成[2,4,5],再删除 arr[2],最后arr里还有两个元素,[2,4]
所以,你可以理解了?
这么写比较简洁:
a = []
for i in range(2, 101):
flag=0
for j in range(2, i):
if i % j == 0:
flag=1
break
if flag==0:
a.append(i)
print(a)
#Function:for循环求质数
a = []
b = []
#求100以内的非质数
for i in range(2,101):
a.append(i)
for j in range(2,i):
if (i%j == 0 and i != j): #判断是否是质数
b.append(i)
break
#将非质数从1-100中移除
for tmp in b:
if a.count(tmp) > 0: #检查元素是否在列表中
a.remove(tmp)
print(a)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
这个是按照题主的思路可以实现功能的代码