关于python中列表操作与for循环结合的问题

问题遇到的现象和发生背景

题目要求:
已知受邀请人名单如下:
names = ['li hua', 'zhao si', 'ma hu', 'liu wei', 'yu jin', 'fang hui', 'da yu', 'ma kai', 'hu jie']
请使用pop()不断地删除受邀请人名单,直到只有‘zhao si’和‘ma hu’两位为止,对于被删除的人请告诉他们下次一起共进晚餐,而对于zhao si和ma hu告诉他们仍在受邀请之列。

问题相关代码,请勿粘贴截图
names = ['li hua', 'zhao si', 'ma hu', 'liu wei', 'yu jin', 'fang hui', 'da yu', 'ma kai', 'hu jie']

for name in names:
    if name == 'zhao si':
        print(f"Dear {name}, you are still invited!")
    elif name == 'ma hu':
        print(f"Dear {name}, you are still invited!")
    else:
        uninvited_name = names.pop()
        print(f"Sorry {uninvited_name}, let's have dinner next time!")
        
# 为什么除了'zhao si'和'ma hu'还有其他人在名单之中?
print(names)

运行结果及报错内容
Sorry hu jie, let's have dinner next time!
Dear zhao si, you are still invited!
Dear ma hu, you are still invited!
Sorry ma kai, let's have dinner next time!
Sorry da yu, let's have dinner next time!
Sorry fang hui, let's have dinner next time!
['li hua', 'zhao si', 'ma hu', 'liu wei', 'yu jin']
我的解答思路和尝试过的方法

使用for循环遍历列表,如果名字是'zhao si'或者'ma hu'就输出一句话,其他的则删除列表并致歉。

我想要达到的结果

列表中只剩'zhao si'和'ma hu'

对于一边循环一边删除的操作,可以用倒序循环。
你题目的解答代码如下:

names = ['li hua', 'zhao si', 'ma hu', 'liu wei', 'yu jin', 'fang hui', 'da yu', 'ma kai', 'hu jie']

for i in range(len(names)-1,-1,-1):
    name = names[i]
    if name == 'zhao si':
        print(f"Dear {name}, you are still invited!")
    elif name == 'ma hu':
        print(f"Dear {name}, you are still invited!")
    else:
        uninvited_name = names.pop(i)
        print(f"Sorry {uninvited_name}, let's have dinner next time!")

# 为什么除了'zhao si'和'ma hu'还有其他人在名单之中?
print(names)

img

要正序循环可以这样

names = ['li hua', 'zhao si', 'ma hu', 'liu wei', 'yu jin', 'fang hui', 'da yu', 'ma kai', 'hu jie']
i = 0
while i < len(names):
    name = names[i]
    if name == 'zhao si' or name == 'ma hu':
        print(f"Dear {name}, you are still invited!")
        i += 1
    else:
        uninvited_name = names.pop(i)
        print(f"Sorry {uninvited_name}, let's have dinner next time!")

print(names)

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

pop()方法删除的是最后一个元素,
names = ['li hua', 'zhao si', 'ma hu', 'liu wei', 'yu jin', 'fang hui', 'da yu', 'ma kai', 'hu jie']
遍历'li hua', 'zhao si', 'ma hu', 'liu wei', 'yu jin','fang hui'六个的时候, 'zhao si', 'ma hu'分别输出了邀请的话,而其余四个则删除了列表末尾的四个元素,等于列表有9个人,但for循环只循环了6次。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632