while 循环简介中,我们探讨了如何使用 while
循环来处理单个用户输入。然而,在实际应用中,经常需要记录大量的用户信息,并对这些信息进行管理和操作。为此,我们可以结合使用 while
循环与列表和字典,以便收集、存储并组织大量数据,供后续查看或进一步处理。
在列表之间移动元素
设想你有一个包含新注册但尚未验证的网站用户的列表。你的任务是验证这些用户,并将已验证的用户从待验证列表移到另一个列表中。下面是一个示例程序,演示了如何使用 while
循环来实现这一过程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 首先,创建一个待验证用户列表和一个用于存储已验证用户的空列表
unconfirmed_users = ['alice', 'brian', 'candace'] # ❶ 创建未验证用户列表
confirmed_users = [] # 创建一个空列表用于存储已验证用户
# 验证每个用户,直到没有未验证用户为止
# 将每个经过验证的用户都移到已验证用户列表中
while unconfirmed_users: # ❷ 当 unconfirmed_users 列表不为空时,循环继续执行
current_user = unconfirmed_users.pop() # ❸ 从列表末尾移除一个用户,并赋值给 current_user
print(f"Verifying user: {current_user.title()}") # 模拟用户验证过程
confirmed_users.append(current_user) # ❹ 将当前用户添加到已验证用户列表
# 显示所有的已验证用户
print("\nThe following users have been confirmed:")
for confirmed_user in confirmed_users:
print(confirmed_user.title())
|
在这个例子中:
- 我们首先创建了一个包含未验证用户的列表
unconfirmed_users
(见❶),以及一个用来存储已验证用户的空列表 confirmed_users
。 - 然后,使用
while
循环不断地运行(见❷),直到 unconfirmed_users
列表变为空。这个条件确保了只有当所有用户都被验证后,循环才会停止。 - 在每次循环迭代中,使用
pop()
方法从未验证用户列表的末尾删除一个用户,并将其赋值给变量 current_user
(见❸)。由于 pop()
方法是从列表末尾开始移除元素,因此 Candace
的名字会首先被处理。 - 接着,模拟了一个用户验证过程,打印一条消息表示正在验证该用户,并将
current_user
添加到 confirmed_users
列表中(见❹)。 - 最后,当所有用户都已验证完毕,使用一个
for
循环遍历 confirmed_users
列表,并打印出所有已验证的用户名。
输出结果如下所示:
1
2
3
4
5
6
7
8
| Verifying user: Candace
Verifying user: Brian
Verifying user: Alice
The following users have been confirmed:
Candace
Brian
Alice
|
删除为特定值的所有列表元素
在处理列表时,有时需要删除列表中所有等于某个特定值的元素。虽然在删除列表元素中我们介绍了如何使用 remove()
方法来删除列表中的特定值,但这种方法只适用于列表中该值出现一次的情况。如果列表中包含多个相同的值,并且你希望删除所有这些值,则需要采用不同的方法。
下面是一个示例程序,展示了如何使用 while
循环来删除列表中所有值为 'cat'
的元素:
1
2
3
4
5
6
7
8
| pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets) # 打印原始列表
# 使用 while 循环删除所有值为 'cat' 的元素
while 'cat' in pets:
pets.remove('cat') # 每次从列表中移除一个 'cat'
print(pets) # 打印删除后的列表
|
首先创建一个列表,其中包含多个值为 'cat'
的元素。打印这个列表后,Python 进入 while
循环,因为它发现 'cat'
在列表中至少出现了一次。进入这个循环后,Python 删除第一个 'cat'
并返回 while
代码行,然后发现 'cat'
还在列表中,因此再次进入循环。
它不断删除 'cat'
,直到在列表中不再包含这个值,然后退出循环并再次打印列表:
1
2
| ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']
|
第一次打印显示的是原始列表,包括所有的 'cat'
元素。第二次打印则显示了经过处理后的新列表,其中所有的 'cat'
都已经被成功移除。
使用用户输入填充字典
当你需要收集大量信息,并希望将这些信息与特定的输入者关联起来时,使用字典是一个非常有效的方法。下面的例子展示了一个简单的调查程序,该程序利用 while
循环提示用户输入任意多的信息,并将这些信息存储在一个字典中,以便将回答与被调查者关联起来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| responses = {} # 初始化一个空字典用于存储用户的回答
polling_active = True # 设置一个标志变量,用于控制调查是否继续进行
while polling_active:
# 提示用户输入他们的名字和他们想要攀登的山峰名称
name = input("\nWhat is your name? ") # ❶ 用户的名字
response = input("Which mountain would you like to climb someday? ") # 用户想攀登的山峰
# 将用户的回答存储在字典中
responses[name] = response # ❷ 将每个用户的回答与他们的名字关联起来
# ❸ 检查是否有其他人要参与调查
repeat = input("Would you like to let another person respond? (yes/no) ")
if repeat == 'no':
polling_active = False # 如果没有更多人参与,则停止循环
# 调查结束,显示结果
print("\n--- Poll Results ---")
for name, response in responses.items(): # ❹ 遍历字典并打印每个用户的回答
print(f"{name} would like to climb {response}.")
|
程序解析:
- 初始化: 首先定义了一个空字典
responses
用来存储用户的回答,并设置了一个布尔标志变量 polling_active
为 True
,以表示调查可以开始。 - while 循环: 只要
polling_active
的值为 True
,Python 就会执行 while
循环中的代码。- 在循环内部,首先通过
input()
函数请求用户提供他们的名字(见❶)以及他们想要攀登的山峰名称。 - 接着,使用用户提供的信息更新
responses
字典(见❷),其中键是用户名字,值是他们想要攀登的山峰名称。
- 检查是否还有其他参与者: 询问用户是否还有其他人愿意参加调查(见❸)。如果用户输入
'no'
,则将 polling_active
设置为 False
,从而退出循环。 - 显示结果: 一旦所有用户都完成了回答,使用
for
循环遍历 responses
字典的所有项(见❹),并打印出每个用户的回答。
如果运行这个程序,并输入一些名字和回答,输出将类似于下面这样:
1
2
3
4
5
6
7
8
9
10
11
| What is your name? Eric
Which mountain would you like to climb someday? Denali
Would you like to let another person respond? (yes/no) yes
What is your name? Lynn
Which mountain would you like to climb someday? Devil's Thumb
Would you like to let another person respond? (yes/no) no
--- Poll Results ---
Eric would like to climb Denali.
Lynn would like to climb Devil's Thumb.
|
通过这种方式,你可以轻松地收集并组织来自多个用户的输入,并且能够清晰地查看每个人的回答。