想打印一组质数却说我列表出错,请问这是什么问题呢?
想要打印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
貌似是列项超纲了?可我没发现有什么问题啊?请问要怎么改?
回答:
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, 你自己慢慢看吧.
回答:
非常不建议在数组遍历时,对于数组进行append和remove操作
回答:
思考了一下,感觉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)

当然可能会有更好的解决方式,这边先暂时想到这儿了,如果有更好的办法,敬请留言,谢谢~
以上是 想打印一组质数却说我列表出错,请问这是什么问题呢? 的全部内容, 来源链接: utcz.com/p/938286.html




