鱼C论坛

 找回密码
 立即注册
查看: 4386|回复: 2

[已解决]抛出异常ValueError: list.remove(x): x not in list,为什么?

[复制链接]
发表于 2021-1-6 14:06:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
7-7 可逆素数 (30分)
输入两个正整数m和n,且m<n,求[m,n]之间的可逆素数列表。可逆素数:素数的各位数字顺序颠倒后得到的数仍是素数

输入格式:
分行输入m和n

输出格式:
输出可逆素数列表

输入样例1:
50
100
输出样例1:
[71, 73, 79, 97]
输入样例2:
200
300
输出样例1:
no exit

  1. m=int(input())
  2. n=int(input())
  3. lst=[]
  4. for i in range(m,n+1):
  5.     for j in range(2,i):
  6.         if i%j==0:
  7.             break
  8.         else:
  9.             lst.append(i)
  10.             break
  11. if len(lst)==0:
  12.     print("no exit")
  13. else:
  14.     for q in lst:
  15.         p=str(q)
  16.         p=p[::-1]
  17.         p=int(p)
  18.         for k in range(2,p):
  19.             if p%k==0:
  20.                 lst.remove(q)
  21.                 continue
  22.     print(lst)
复制代码


异常:Traceback (most recent call last):
  File "C:\Users\Zoe\Desktop\55.py", line 20, in <module>
    lst.remove(q)
ValueError: list.remove(x): x not in list

好奇怪q明明应该在lst里面鸭?
最佳答案
2021-1-6 14:24:15
本帖最后由 jackz007 于 2021-1-6 15:24 编辑
  1.         if i % j == 0 :
  2.             break
  3.         else:
  4.             lst.append(i)
  5.             break
复制代码

      一个数只算一次就能确定是素数?
      一个数如果能找到因子,那就可以否定素数,而肯定素数必须是在枚举完所有可能的因子之后,也就是在循环完以后。
  1.         for k in range(2,p):
  2.             if p%k==0:
  3.                 lst.remove(q)
  4.                 continue
复制代码

      lst 中肯定只有一个 q,删除掉了还不 break 退出,却还 continue,意思是还要继续删除,如果 lst 中的某个素数恰好可以找到一个以上的因子,那 q 就得删除多次,你的错误就是因为这个原因造成。
        下面是修改后的代码
  1. m = int(input())
  2. n = int(input())
  3. lst = []
  4. for i in range(m , n + 1):
  5.     for j in range(2 , i):
  6.         if i % j == 0 :
  7.             break
  8.     else:
  9.         lst . append(i)
  10. for q in lst[:]:                       # 【关键点】,由于 lst 可能会在循环中被改变,所以,一定要依据其副本来控制循环
  11.     p = int(str(q)[::-1])
  12.     for k in range(2 , p):
  13.         if p % k == 0 :
  14.             lst . remove(q)
  15.             break
  16. if len(lst):
  17.     print('%d' % lst[0] , end = '')
  18.     for i in range(1 , len(lst)):
  19.         print(' %d' % lst[i] , end = '')
  20.     print()
  21. else:
  22.     print("no exit")
复制代码


        下面是我写的代码,仅供楼主参考

  1. def reverse(n):
  2.     r = 0
  3.     while n:
  4.         r = r * 10 + n % 10
  5.         n //= 10
  6.     return r

  7. def prime(n):
  8.     r = False
  9.     if n > 1:
  10.         r , i = True , 2
  11.         while i * i < n + 1:
  12.             if i < n and n % i == 0 :
  13.                 r = False
  14.                 break
  15.             i += 1
  16.     return r

  17. m , n , c = int(input()) , int(input()) , 0
  18. for i in range(m , n + 1) :
  19.     if prime(i) and prime(reverse(i)):
  20.         if c :
  21.             print(' ' , end = '')
  22.         print(i , end = '')
  23.         c += 1
  24. if c :
  25.     print()
  26. else:
  27.     print("no exit")
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-6 14:24:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-6 15:24 编辑
  1.         if i % j == 0 :
  2.             break
  3.         else:
  4.             lst.append(i)
  5.             break
复制代码

      一个数只算一次就能确定是素数?
      一个数如果能找到因子,那就可以否定素数,而肯定素数必须是在枚举完所有可能的因子之后,也就是在循环完以后。
  1.         for k in range(2,p):
  2.             if p%k==0:
  3.                 lst.remove(q)
  4.                 continue
复制代码

      lst 中肯定只有一个 q,删除掉了还不 break 退出,却还 continue,意思是还要继续删除,如果 lst 中的某个素数恰好可以找到一个以上的因子,那 q 就得删除多次,你的错误就是因为这个原因造成。
        下面是修改后的代码
  1. m = int(input())
  2. n = int(input())
  3. lst = []
  4. for i in range(m , n + 1):
  5.     for j in range(2 , i):
  6.         if i % j == 0 :
  7.             break
  8.     else:
  9.         lst . append(i)
  10. for q in lst[:]:                       # 【关键点】,由于 lst 可能会在循环中被改变,所以,一定要依据其副本来控制循环
  11.     p = int(str(q)[::-1])
  12.     for k in range(2 , p):
  13.         if p % k == 0 :
  14.             lst . remove(q)
  15.             break
  16. if len(lst):
  17.     print('%d' % lst[0] , end = '')
  18.     for i in range(1 , len(lst)):
  19.         print(' %d' % lst[i] , end = '')
  20.     print()
  21. else:
  22.     print("no exit")
复制代码


        下面是我写的代码,仅供楼主参考

  1. def reverse(n):
  2.     r = 0
  3.     while n:
  4.         r = r * 10 + n % 10
  5.         n //= 10
  6.     return r

  7. def prime(n):
  8.     r = False
  9.     if n > 1:
  10.         r , i = True , 2
  11.         while i * i < n + 1:
  12.             if i < n and n % i == 0 :
  13.                 r = False
  14.                 break
  15.             i += 1
  16.     return r

  17. m , n , c = int(input()) , int(input()) , 0
  18. for i in range(m , n + 1) :
  19.     if prime(i) and prime(reverse(i)):
  20.         if c :
  21.             print(' ' , end = '')
  22.         print(i , end = '')
  23.         c += 1
  24. if c :
  25.     print()
  26. else:
  27.     print("no exit")
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-6 15:05:01 | 显示全部楼层
jackz007 发表于 2021-1-6 14:24
一个数只算一次就能确定是素数?
      一个数如果能找到因子,那就可以否定素数,而肯定素数必须 ...

太感谢了帮助很大
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 13:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表