while 循环 跟 for 循环下的不同输出
本帖最后由 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']
你提出了一个很好的问题!让我们幽默地分析一下为什么在 `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 小助理,如未能正确解答您的问题,请继续追问。 不要一边for x in 列表一边改动列表,这样索引会被打乱 歌者文明清理员 发表于 2024-7-28 13:51
不要一边for x in 列表一边改动列表,这样索引会被打乱
现在明白了。所以上面的解法,是要复制一个新列表,在新列表里for循环,然后用原来列表里面pop 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
页:
[1]