鱼C论坛

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

[已解决]循环执行问题

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

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

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

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


num = int(input('请输入总人数: '))
s = int(input('请输入周期: '))
la = int(input('请输入剩余人数: '))
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
我也看到了这一步,用复制的方法,但是我还是不能理解,复制的列表不是一样吗?
同样是先移除,然后复制 ...


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

参考小案例
data = [1,2,3,4,5]
for i in data:
    index_i = data.index(i)
    print(i, data[index_i], i == data[index_i])
    data.remove(i)
    print(i, data[index_i], i == data[index_i])
    print("--------")


r"""
>>> 
======== RESTART: C:\Users\Administrator\Desktop\test.py ========
1 1 True
1 2 False
--------
3 3 True
3 4 False
--------
5 5 True
Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\test.py", line 6, in <module>
    print(i, data[index_i], i == data[index_i])
IndexError: list index out of range
>>>
"""
想知道小甲鱼最近在做啥?请访问 -> 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.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的意思是列表会自动补位?拿掉一个数,然后 后边的自动补齐空缺位,访问下一个数,其实是跳过一位数了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


num = int(input('请输入总人数: '))
s = int(input('请输入周期: '))
la = int(input('请输入剩余人数: '))
ysf(num, s, la)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我也看到了这一步,用复制的方法,但是我还是不能理解,复制的列表不是一样吗?
同样是先移除,然后复制,复制的结果不是和在原列表操作时一样的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

参考小案例
data = [1,2,3,4,5]
for i in data:
    index_i = data.index(i)
    print(i, data[index_i], i == data[index_i])
    data.remove(i)
    print(i, data[index_i], i == data[index_i])
    print("--------")


r"""
>>> 
======== RESTART: C:\Users\Administrator\Desktop\test.py ========
1 1 True
1 2 False
--------
3 3 True
3 4 False
--------
5 5 True
Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\test.py", line 6, in <module>
    print(i, data[index_i], i == data[index_i])
IndexError: list index out of range
>>>
"""
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢,原来如此!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 12:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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