到目前为止,我们每次都只处理了一项用户信息:获取用户的输入,再将输入打印出来或作出应答;循环再次运行时,我们获悉另一个输入值并作出响应。然而,要记录大量的用户和信息,需要在while循环中使用列表和字典。

for循环是一种遍历列表的有效方式,但在for循环中不应修改列表,否则将导致Python难以跟踪其中的元素。要在遍历列表的同时对其进行修改,可使用while循环。通过将while循环同列表和字典结合起来使用,可收集、存储并组织大量输入,供以后查看和显示。

7.3.1 在列表之间移动元素

比如我们有一个女友的列表,后来分手后,变成了前女友:

  1. girlfriends = ['Tang', 'Zhao', 'Yang']
  2. ex_girlfriends = []
  3. while girlfriends:
  4. ex = girlfriends.pop()
  5. print(f'你和{ex}分手了,真遗憾。')
  6. ex_girlfriends.append(ex)
  7. print('-----------------------------')
  8. for ex in ex_girlfriends:
  9. 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循环,直到列表中不再包含值’生化危机’,如下所示:

  1. games = ['生化危机', '仙剑奇侠传', '古剑奇谭', '生化危机', '轩辕剑', '生化危机', '吞食天地']
  2. print(games)
  3. while '生化危机' in games:
  4. games.remove('生化危机')
  5. print(games)

我们首先创建了一个列表,其中包含多个值为’生化危机’的元素。打印这个列表后,Python进入while循环,因为它发现’生化危机’在列表中至少出现了一次。进入这个循环后,Python删除第一个’生化危机’并返回到while代码行,然后发现’生化危机’还包含在列表中,因此再次进入循环。它不断删除’生化危机’,直到这个值不再包含在列表中,然后退出循环并再次打印列表:


[‘生化危机’, ‘仙剑奇侠传’, ‘古剑奇谭’, ‘生化危机’, ‘轩辕剑’, ‘生化危机’, ‘吞食天地’]
[‘仙剑奇侠传’, ‘古剑奇谭’, ‘轩辕剑’, ‘吞食天地’]


7.3.3 使用用户输入来填充字典

可使用while循环提示用户输入任意数量的信息。下面来创建一个调查程序,其中的循环每次执行时都提示输入被调查者的名字和回答。我们将收集的数据存储在一个字典中,以便将回答同被调查者关联起来:

  1. # hobby_poll.py
  2. poll_active = True
  3. poll_result = {}
  4. while poll_active:
  5. name = input('您叫什么名字?')
  6. response = input('您最大的爱好是什么?')
  7. poll_result[name] = response
  8. repeat = input('还要继续做调查吗?')
  9. if repeat.lower() != 'yes':
  10. poll_active = False
  11. print('------调查结果------')
  12. for name, response in poll_result.items():
  13. 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最爱的是撸猫