鱼C论坛

 找回密码
 立即注册
查看: 1553|回复: 5

[已解决]新手python学习求助

[复制链接]
发表于 2018-4-11 14:06:39 | 显示全部楼层 |阅读模式

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

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

x
目标:选择出list中可以整除各位数的元素,比如24可整除2和4,15可整除1和5.
n = [76,89,46,15,24]
num = []
for i in n:
    temp = i
    while temp>0:
        (temp,r) = divmod(temp,10)
        num.append(r)
    for j in num:               
        if i%j !=0:
            n.remove(i)
print (n)
运行程序后报错
1523426808(1).jpg

请问该如何修改,才能实现目标?
最佳答案
2018-4-11 16:24:20
楼主这种写法:
    1. num应该在每个循环的开始位置置空,否则越变越多
    2. 3楼说的break
    3. 1楼的警示,此例中列表会在循环里发生变化,那就不能让它作为循环对象
上面第3条中,程序只会检查76,46和24。76被删除后,它占据的0位置被89代替,而循环下一个该执行的是1位置,因此89跳过,测试46,同理15跳过。因此楼主的程序最终会剩下89,15,24。
解决方法:做一个和n一样的n2,让n2去循环,最终代码如下
  1. n = [76,89,46,15,24]
  2. **n2 = []**
  3. **for i in n:**
  4.     **n2.append(i)**
  5. for i in n2:
  6.     **num = []**
  7.     temp = i
  8.     while temp>0:
  9.         (temp,r) = divmod(temp,10)
  10.         num.append(r)
  11.     for j in num:               
  12.         if i % j !=0:
  13.             n.remove(i)
  14.             **break**
  15. print (n)
复制代码

还是推荐4楼的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-4-11 14:31:29 | 显示全部楼层
不要将一个在循环体内会改变的可迭代对象作为循环的对象,比如
n=[1,2,3]
for i in n:
    n.pop()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-11 14:59:49 | 显示全部楼层
因为你这句
for j in num: #j在num里边有几个值就需要执行几遍            
        if i%j !=0:#如果第一遍i不能整除j,下边那句n.remove(i)就在n里边移除了i,但是j在num里边还有一个值,所以上边的for语句还在执行,结果下一次再执行n.remove(i),发现n里边已经没有i,程序报错了。
知道了原因,那么你只要n.remove(i)后边加一个break这个程序就没有问题了。
         
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-11 15:51:23 | 显示全部楼层
根据楼主的意思改了下~不知道是不是楼主想要的~

  1. n = [76,89,46,15,24]
  2. num = []
  3. for i in n:
  4.     (t, r) = divmod(i, 10)
  5.     if i % t == 0 and i % r == 0:
  6.         num.append(i)
  7.    
  8. print(num)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-11 16:24:20 | 显示全部楼层    本楼为最佳答案   
楼主这种写法:
    1. num应该在每个循环的开始位置置空,否则越变越多
    2. 3楼说的break
    3. 1楼的警示,此例中列表会在循环里发生变化,那就不能让它作为循环对象
上面第3条中,程序只会检查76,46和24。76被删除后,它占据的0位置被89代替,而循环下一个该执行的是1位置,因此89跳过,测试46,同理15跳过。因此楼主的程序最终会剩下89,15,24。
解决方法:做一个和n一样的n2,让n2去循环,最终代码如下
  1. n = [76,89,46,15,24]
  2. **n2 = []**
  3. **for i in n:**
  4.     **n2.append(i)**
  5. for i in n2:
  6.     **num = []**
  7.     temp = i
  8.     while temp>0:
  9.         (temp,r) = divmod(temp,10)
  10.         num.append(r)
  11.     for j in num:               
  12.         if i % j !=0:
  13.             n.remove(i)
  14.             **break**
  15. print (n)
复制代码

还是推荐4楼的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-12 11:20:40 | 显示全部楼层
多谢各位
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-10 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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