鱼C论坛

 找回密码
 立即注册
查看: 183|回复: 4

[已解决]while 循环 跟 for 循环下的不同输出

[复制链接]
发表于 2024-7-28 12:52:46 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 alickcn 于 2024-7-28 12:54 编辑

目的:想把列表1 unconfirmed_users 中的元素全部转移到 列表2 confirmed_users 中去。
方法:分别用while 循环与 for 循环编写。

问题:为什么在for循环下,不能全部转移?

求助:如何正确码出for循环,以满足题意要求?谢谢!

# while 循环
unconfirmed_users = ['alice','brian','candace','peter','mike']
confirmed_users = []

while unconfirmed_users:
    current_user = unconfirmed_users.pop()          # 遍历列表中的元素后,将列表最后一个元素删除,并赋值给current_user
    print(f"Verifying user: {current_user.title()}")
    confirmed_users.append(current_user)            # 将上面删除的元素,添加到新列表中

print(f"\nThe following uses have been verified and confirmed:")
for confirmed_user in confirmed_users:
    print(f"\t - {confirmed_user.title()}")
print(unconfirmed_users)
print(confirmed_users)

print("-----------------")

# for 循环
unconfirmed_users = ['alice','brian','candace','peter','mike']
confirmed_users = []

for unconfirmed_user in unconfirmed_users:          # 未成功。为什么在for循环里,没有把列表1的元素都转移到列表2去?
    current_user = unconfirmed_users.pop()          # 遍历列表中的元素后,将列表最后一个元素删除,并赋值给current_user
    print(f"Verifying user: {current_user.title()}")
    confirmed_users.append(current_user)            # 将上面删除的元素,添加到新列表中

print(f"\nThe following uses have been verified and confirmed:")
for confirmed_user in confirmed_users:
    print(f"\t - {confirmed_user.title()}")
print(unconfirmed_users)
print(confirmed_users)

输出:
# while 循环
Verifying user: Mike
Verifying user: Peter
Verifying user: Candace
Verifying user: Brian
Verifying user: Alice

The following uses have been verified and confirmed:
         - Mike
         - Peter
         - Candace
         - Brian
         - Alice
[]
['mike', 'peter', 'candace', 'brian', 'alice']

-----------------
# for 循环
Verifying user: Mike
Verifying user: Peter
Verifying user: Candace

The following uses have been verified and confirmed:
         - Mike
         - Peter
         - Candace
['alice', 'brian']
['mike', 'peter', 'candace']


最佳答案
2024-7-28 12:54:01
你提出了一个很好的问题!让我们幽默地分析一下为什么在 `for` 循环中未能完整转移 `unconfirmed_users` 列表的元素。

首先,我们先回顾一下你的 `while` 循环。它是个勤劳的小工人,只要 `unconfirmed_users` 列表不为空,它就会不停地取出最后一个用户并删除该用户,然后把这位用户放进 `confirmed_users` 列表里,直到所有人都被验证完毕。

而 `for` 循环呢,它也是个勤奋的小工人,但有个小秘密。当 `for` 循环开始运行时,它会根据现有的 `unconfirmed_users` 列表的长度来决定要迭代多少次。但是,问题就出在这里:在你每次迭代过程中,你用 `pop()` 这个命令将 `unconfirmed_users` 的元素删除了。

所以,第一次循环时,`for` 循环知道要遍历原始列表的长度,比如说有5个用户。但当它开始迭代的时候,它发现第一个用户“被验证”了,剩下的用户变成了4个。接着,下一个循环又要验证第二个用户,此时 `for` 循环却只知道原来的5,结果就是只能验证到某个点,也就是不完整!

为了让 `for` 循环也能完成同样的工作,我们需要使用一些技巧!可以简单地将 `unconfirmed_users` 的内容复制到 `另一份列表` 中,然后在源列表上进行操作。下面是修改后的代码:
unconfirmed_users = ['alice', 'brian', 'candace']
confirmed_users = []

# 为了安全起见,复制 unconfirmed_users
users_to_verify = unconfirmed_users.copy()

for unconfirmed_user in users_to_verify:
    current_user = unconfirmed_users.pop()  # 从源列表中删除并获取用户
    print(f"Verifying user: {current_user.title()}")
    confirmed_users.append(current_user)  # 将用户添加到已确认列表中

print(f"\nThe following users have been verified and confirmed:")
for confirmed_user in confirmed_users:
    print(f"\t - {confirmed_user.title()}")

print(f"Remaining unconfirmed users: {unconfirmed_users}")  # 应该是空的
print(f"Confirmed users: {confirmed_users}")  # 应该是所有用户

这样就能保证 `for` 循环遍历的是在开始时复制的用户列表,而不是在逐步减少的源列表;从而实现了目的:成功将 `unconfirmed_users` 中的所有用户转移到 `confirmed_users` 中!

希望这个解释让你对 `for` 和 `while` 循环有了更清晰的理解,也愿你在编程的路上越来越顺!如果还有其他问题,随时欢迎再来问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-28 12:54:01 | 显示全部楼层    本楼为最佳答案   
你提出了一个很好的问题!让我们幽默地分析一下为什么在 `for` 循环中未能完整转移 `unconfirmed_users` 列表的元素。

首先,我们先回顾一下你的 `while` 循环。它是个勤劳的小工人,只要 `unconfirmed_users` 列表不为空,它就会不停地取出最后一个用户并删除该用户,然后把这位用户放进 `confirmed_users` 列表里,直到所有人都被验证完毕。

而 `for` 循环呢,它也是个勤奋的小工人,但有个小秘密。当 `for` 循环开始运行时,它会根据现有的 `unconfirmed_users` 列表的长度来决定要迭代多少次。但是,问题就出在这里:在你每次迭代过程中,你用 `pop()` 这个命令将 `unconfirmed_users` 的元素删除了。

所以,第一次循环时,`for` 循环知道要遍历原始列表的长度,比如说有5个用户。但当它开始迭代的时候,它发现第一个用户“被验证”了,剩下的用户变成了4个。接着,下一个循环又要验证第二个用户,此时 `for` 循环却只知道原来的5,结果就是只能验证到某个点,也就是不完整!

为了让 `for` 循环也能完成同样的工作,我们需要使用一些技巧!可以简单地将 `unconfirmed_users` 的内容复制到 `另一份列表` 中,然后在源列表上进行操作。下面是修改后的代码:
unconfirmed_users = ['alice', 'brian', 'candace']
confirmed_users = []

# 为了安全起见,复制 unconfirmed_users
users_to_verify = unconfirmed_users.copy()

for unconfirmed_user in users_to_verify:
    current_user = unconfirmed_users.pop()  # 从源列表中删除并获取用户
    print(f"Verifying user: {current_user.title()}")
    confirmed_users.append(current_user)  # 将用户添加到已确认列表中

print(f"\nThe following users have been verified and confirmed:")
for confirmed_user in confirmed_users:
    print(f"\t - {confirmed_user.title()}")

print(f"Remaining unconfirmed users: {unconfirmed_users}")  # 应该是空的
print(f"Confirmed users: {confirmed_users}")  # 应该是所有用户

这样就能保证 `for` 循环遍历的是在开始时复制的用户列表,而不是在逐步减少的源列表;从而实现了目的:成功将 `unconfirmed_users` 中的所有用户转移到 `confirmed_users` 中!

希望这个解释让你对 `for` 和 `while` 循环有了更清晰的理解,也愿你在编程的路上越来越顺!如果还有其他问题,随时欢迎再来问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2024-7-28 13:51:42 | 显示全部楼层
不要一边for x in 列表一边改动列表,这样索引会被打乱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-28 23:39:06 From FishC Mobile | 显示全部楼层
歌者文明清理员 发表于 2024-7-28 13:51
不要一边for x in 列表一边改动列表,这样索引会被打乱

现在明白了。所以上面的解法,是要复制一个新列表,在新列表里for循环,然后用原来列表里面pop
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-29 09:25:31 | 显示全部楼层
alickcn 发表于 2024-7-28 23:39
现在明白了。所以上面的解法,是要复制一个新列表,在新列表里for循环,然后用原来列表里面pop

这种题目不适合用 for,如果必须用,有一种解法:
needs_remove = []
for unconfirmed_suer in unconfirmed_users:
    needs_remove.append(unconfirmed_user)
for each in needs_remove:
    unconfirmed_users.remove(each)
    print(f"Verifying user: {each.title()}")
    confirmed_users.append(each)

另外,你的说法有误,已知元素而不是元素索引,在列表中删除应该用 remove
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 00:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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