到目前为止,我们每次都只处理了一项用户信息:获取用户的输入,再将输入打印出来或作出应答;循环再次运行时,我们获悉另一个输入值并作出响应。然而,要记录大量的用户和信息,需要在while循环中使用列表和字典。
for循环是一种遍历列表的有效方式,但在for循环中不应修改列表,否则将导致Python难以跟踪其中的元素。要在遍历列表的同时对其进行修改,可使用while循环。通过将while循环同列表和字典结合起来使用,可收集、存储并组织大量输入,供以后查看和显示。
7.3.1 在列表之间移动元素
比如我们有一个女友的列表,后来分手后,变成了前女友:
girlfriends = ['Tang', 'Zhao', 'Yang']
ex_girlfriends = []
while girlfriends:
ex = girlfriends.pop()
print(f'你和{ex}分手了,真遗憾。')
ex_girlfriends.append(ex)
print('-----------------------------')
for ex in ex_girlfriends:
print(f'{ex}已经是你的前女友了')
我们首先创建一个girlfriends列表,里面有三位女孩。然后创建一个ex_girlfriends空列表,用于储存分手后的女友。while girlfriends的意思是说,当girlfriends列表不为空是,执行while循环。这是while len(girlfriends) != 0的简写。while循环内部,我们将girlfriends列表调用pop()函数抛出最后一个元素,然后将这个元素添加到ex_girlfriends列表中,最后输出:
你和Yang分手了,真遗憾。
你和Zhao分手了,真遗憾。
你和Tang分手了,真遗憾。
——————————————-
Yang已经是你的前女友了
Zhao已经是你的前女友了
Tang已经是你的前女友了
7.3.2 删除包含特定值的所有列表元素
在第3章中,我们使用函数remove()来删除列表中的特定值,这之所以可行,是因为要删除的值在列表中只出现了一次。如果要删除列表中所有包含特定值的元素,该怎么办呢?
假设你有一个游戏列表,其中包含多个值为’生化危机’的元素。要删除所有这些元素,可不断运行一个while循环,直到列表中不再包含值’生化危机’,如下所示:
games = ['生化危机', '仙剑奇侠传', '古剑奇谭', '生化危机', '轩辕剑', '生化危机', '吞食天地']
print(games)
while '生化危机' in games:
games.remove('生化危机')
print(games)
我们首先创建了一个列表,其中包含多个值为’生化危机’的元素。打印这个列表后,Python进入while循环,因为它发现’生化危机’在列表中至少出现了一次。进入这个循环后,Python删除第一个’生化危机’并返回到while代码行,然后发现’生化危机’还包含在列表中,因此再次进入循环。它不断删除’生化危机’,直到这个值不再包含在列表中,然后退出循环并再次打印列表:
[‘生化危机’, ‘仙剑奇侠传’, ‘古剑奇谭’, ‘生化危机’, ‘轩辕剑’, ‘生化危机’, ‘吞食天地’]
[‘仙剑奇侠传’, ‘古剑奇谭’, ‘轩辕剑’, ‘吞食天地’]
7.3.3 使用用户输入来填充字典
可使用while循环提示用户输入任意数量的信息。下面来创建一个调查程序,其中的循环每次执行时都提示输入被调查者的名字和回答。我们将收集的数据存储在一个字典中,以便将回答同被调查者关联起来:
# hobby_poll.py
poll_active = True
poll_result = {}
while poll_active:
name = input('您叫什么名字?')
response = input('您最大的爱好是什么?')
poll_result[name] = response
repeat = input('还要继续做调查吗?')
if repeat.lower() != 'yes':
poll_active = False
print('------调查结果------')
for name, response in poll_result.items():
print(f"{name}最爱的是{response}")
这个程序首先定义了一个空字典(responses),并设置了一个标志(polling_active),用于指出调查是否继续。只要polling_active为True,Python就运行while循环中的代码。
在这个循环中,提示用户输入其用户名及其最大的爱好。将这些信息存储在字典responses中,然后询问用户调查是否继续。如果用户输入yes,程序将再次进入while循环;如果用户输入no,标志polling_active将被设置为False,而while循环将就此结束。最后一个代码块显示调查结果。
如果你运行这个程序,并输入一些名字和回答,输出将类似于下面这样:
您叫什么名字? Thomas
您最大的爱好是什么? 踢足球
还要继续做调查吗? yes
您叫什么名字? Six
您最大的爱好是什么? 撸猫
还要继续做调查吗? no
———调查结果———
Thomas最爱的是踢足球
Six最爱的是撸猫