AresFC 发表于 2021-1-12 20:11:51

新手求助!一个关于素数的提问

各位大神麻烦帮忙看下 为什么输出的时候13没有被移除{:10_245:}

先贴问题要求:
编写程序,实现将列表 ls =
中的素数去除,并输出去除素数后列表 ls 的元素个数。

下面是我写的代码
ls =
for i in ls:
    for j in range(2,i):
      if i%j==0:
            break
    else:
      ls.remove(i)
print(ls)
print('长度为:',len(ls))

AresFC 发表于 2021-1-12 20:12:49

运行代码之后得到的结果是


长度为: 10

为什么13还在啊…

qq1151985918 发表于 2021-1-12 20:25:47

本帖最后由 qq1151985918 于 2021-1-12 20:48 编辑

看你这段代码

ls =
for i in ls:
    for j in range(2,i):
      if i%j==0:
            break
    else:
      ls.remove(i)
      #问题就出在ls.remove(i)了
      #当你在ls.remove之后ls已经发生改变
      #随之变动的还有最外围的for循环
      #你可以尝试换一种思路
      #不对ls列表进行操作新建一个空列表
      #讲非素数添加进空列表
print(ls)
print('长度为:',len(ls))

#-----------------------------------
print('\n-----------------------------------\n')

ls =
newls = []

for i in ls:
    for j in range(2,i):
      if i % j == 0:
            newls.append(i)#这样就可以了
            break
   
print(newls)
print('长度为:',len(newls))

永恒的蓝色梦想 发表于 2021-1-12 20:44:26

第二行改为 for i in tuple(ls):

jackz007 发表于 2021-1-12 20:54:05

本帖最后由 jackz007 于 2021-1-12 20:55 编辑

      这一句
for i in ls:
      改为
for i in ls[:]:# 如果列表在循环中有元素的增减,则必须用列表的副本来控制循环
      

qiuyouzhi 发表于 2021-1-12 20:55:12

你得在切片上遍历列表呀,不然一边遍历一边从里面移除数据会导致少遍历几个元素
这里附上两种方案:
ls =
res = []
for i in ls:
    for j in range(2,i):
      if i%j==0:
            res.append(i)
            break
print(res)
print('长度为:',len(res))

ls =
for i in ls[:]:
    for j in range(2,i):
      if i%j==0:
            break
    else:
      if i in ls:
            ls.remove(i)
print(ls)
print('长度为:',len(ls))

AresFC 发表于 2021-1-13 10:01:15

明白了!谢谢大家!!!
页: [1]
查看完整版本: 新手求助!一个关于素数的提问