想打印一组质数却说我列表出错,请问这是什么问题呢?

想要打印100以内的质数,代码撸下:

lists = list(range(3,101))
for i in lists:
    for j in range(2,i):
        if i%j == 0:
            lists.remove(i)
            continue
print(lists)

然后就提示:

ValueError: list.remove(x): x not in list

貌似是列项超纲了?可我没发现有什么问题啊?请问要怎么改?

阅读 1.7k
3 个回答

ValueError: list.remove(x): x not in list的翻译是 值错误: 列表.移除(甲): 甲不在列表中
那么为什么甲不在列表中呢?
一种可能性是甲小于3或者大于100.
另一种可能性是甲在3-100之间,但是之前被删除过一次.

基于这2种可能性, 在lists.remove(i) 之前打印列表和甲, 发现6被删除了2次,并且第二次出现6之后立即就报错了.

那么我们只需要在删除前判断一下, 甲是否在列表中即可

lists = list(range(3, 101))
for i in lists:
    for j in range(2, i):
        if i % j == 0:
            if i in lists:
                lists.remove(i)
            continue
print(lists)

这段代码还有其他bug, 你自己慢慢看吧.

非常不建议在数组遍历时,对于数组进行appendremove操作

思考了一下,感觉lists.remove那里的确有重复删除的问题,于是重新撸了代码,再优化了一下,终于成功了。代码如下:

while True:
    n = input("请输入需要挑选出质数的数据范围:")
    try:
        m = int(n)+1
    except ValueError:
        if n == "q":
            break # 使用“q"来退出交互
        else:
            print("您的输入有误,请重新输入!")
            continue
    lists = [2]
    sets = set({})
    for i in range(3, m):
        lists.append(i)
        for j in range(2, i):
            if i % j == 0: # 先选出合数,然后存进集合中
                sets.add(i) # 用集合是为了防止遍历过程中被重复传值
        for n in lists:
            if n in sets: # 将合数集合中的值与lists中的值相比较
                lists.remove(n) # 如果值一样就删除lists中的合数,这样剩下的就只有质数了
    print(lists)

测试结果
当然可能会有更好的解决方式,这边先暂时想到这儿了,如果有更好的办法,敬请留言,谢谢~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题