鱼C论坛

 找回密码
 立即注册
查看: 2063|回复: 6

[已解决]循环执行问题

[复制链接]
发表于 2021-6-10 16:00:40 | 显示全部楼层 |阅读模式

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

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

x
  1. def ysf(n, step, stop):
  2.     lst = list(range(1, n+1))
  3.     check = 0
  4.     while len(lst) > stop:
  5.         for i in lst:
  6.             check += 1
  7.             if check == step:
  8.                 check = 0
  9.                 lst.remove(i)
  10.                 print('{0}号下船了'.format(i))


  11. num = int(input('请输入总人数: '))
  12. s = int(input('请输入周期: '))
  13. la = int(input('请输入剩余人数: '))
  14. ysf(num, s, la)
复制代码


这是约瑟夫生者死者小游戏,程序执行没问题。
但是执行结果只有第一个是对的,从第二个开始就不对了,
我用了pycharm进行调试,当i=9的时候没问题,但是下一步直接进行到了i=11了,中间跳过了i=10这一步,
哪位前辈帮忙解答一下,这是为什么呀?
最佳答案
2021-6-11 08:54:47
本帖最后由 qq1151985918 于 2021-6-11 09:08 编辑
江湖散人 发表于 2021-6-11 08:46
我也看到了这一步,用复制的方法,但是我还是不能理解,复制的列表不是一样吗?
同样是先移除,然后复制 ...


当你移除列表一个元素的时候,这个列表的索引值就已经发生变化了,删除的元素位置由后边的元素顶替,所以会出现遍历列表但是会出现遗漏的情况,所以我们一般对原列表的副本进行遍历。不止是列表,所有可变化的容器类可迭代对象(列表、集合、字典等)都有这个特点

参考小案例

  1. data = [1,2,3,4,5]
  2. for i in data:
  3.     index_i = data.index(i)
  4.     print(i, data[index_i], i == data[index_i])
  5.     data.remove(i)
  6.     print(i, data[index_i], i == data[index_i])
  7.     print("--------")


  8. r"""
  9. >>>
  10. ======== RESTART: C:\Users\Administrator\Desktop\test.py ========
  11. 1 1 True
  12. 1 2 False
  13. --------
  14. 3 3 True
  15. 3 4 False
  16. --------
  17. 5 5 True
  18. Traceback (most recent call last):
  19.   File "C:\Users\Administrator\Desktop\test.py", line 6, in <module>
  20.     print(i, data[index_i], i == data[index_i])
  21. IndexError: list index out of range
  22. >>>
  23. """
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-10 16:21:13 | 显示全部楼层
本帖最后由 灰晨 于 2021-6-10 16:54 编辑

虽然你问得有点看不懂,不过你这代码我感觉一个地方有点问题,你的问题可能就是这个原因。当check == step的时候,你重置了check = 0,但是你循环没有停下来,没跳出去,比如你n=20,step=15,那么lst就是1-20,第一轮check == step时,15号没了,这时循环for i in lst没停会继续,因为15号没了,此时16号占了15号的位置,所有是会从17号继续循环,同时这时check = 1,即当重新lst重新从1号开始循环时,check已经等于5了。
好像知道你的问题,for i in lst时,你删了一个数,后一个数前进了一位,如上面所说15号没了,16号前进了一位成为第15个数,而第15个数for i in lst认为已经遍历过了,会继续遍历第16个数,而此时第16个数已经不是16了,而是17.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-10 19:33:16 | 显示全部楼层
灰晨 发表于 2021-6-10 16:21
虽然你问得有点看不懂,不过你这代码我感觉一个地方有点问题,你的问题可能就是这个原因。当check == step ...

你的意思是列表会自动补位?拿掉一个数,然后 后边的自动补齐空缺位,访问下一个数,其实是跳过一位数了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 08:27:33 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-6-11 08:33 编辑
  1. def ysf(n, step, stop):
  2.     lst = list(range(1, n+1))
  3.     check = 0
  4.     while len(lst) > stop:
  5.         lst1 = lst[:]
  6.         for i in lst1:
  7.             if len(lst) == stop:
  8.                 break
  9.             check += 1
  10.             if check == step:
  11.                 check = 0
  12.                 lst.remove(i)
  13.                 print('{0}号下船了'.format(i))


  14. num = int(input('请输入总人数: '))
  15. s = int(input('请输入周期: '))
  16. la = int(input('请输入剩余人数: '))
  17. ysf(num, s, la)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-11 08:46:49 | 显示全部楼层

我也看到了这一步,用复制的方法,但是我还是不能理解,复制的列表不是一样吗?
同样是先移除,然后复制,复制的结果不是和在原列表操作时一样的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 08:54:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 qq1151985918 于 2021-6-11 09:08 编辑
江湖散人 发表于 2021-6-11 08:46
我也看到了这一步,用复制的方法,但是我还是不能理解,复制的列表不是一样吗?
同样是先移除,然后复制 ...


当你移除列表一个元素的时候,这个列表的索引值就已经发生变化了,删除的元素位置由后边的元素顶替,所以会出现遍历列表但是会出现遗漏的情况,所以我们一般对原列表的副本进行遍历。不止是列表,所有可变化的容器类可迭代对象(列表、集合、字典等)都有这个特点

参考小案例

  1. data = [1,2,3,4,5]
  2. for i in data:
  3.     index_i = data.index(i)
  4.     print(i, data[index_i], i == data[index_i])
  5.     data.remove(i)
  6.     print(i, data[index_i], i == data[index_i])
  7.     print("--------")


  8. r"""
  9. >>>
  10. ======== RESTART: C:\Users\Administrator\Desktop\test.py ========
  11. 1 1 True
  12. 1 2 False
  13. --------
  14. 3 3 True
  15. 3 4 False
  16. --------
  17. 5 5 True
  18. Traceback (most recent call last):
  19.   File "C:\Users\Administrator\Desktop\test.py", line 6, in <module>
  20.     print(i, data[index_i], i == data[index_i])
  21. IndexError: list index out of range
  22. >>>
  23. """
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-11 17:28:26 | 显示全部楼层
qq1151985918 发表于 2021-6-11 08:54
当你移除列表一个元素的时候,这个列表的索引值就已经发生变化了,删除的元素位置由后边的元素顶替,所 ...

谢谢,原来如此!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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