我已经宣布了一个我想操纵的元组列表。我有一个函数返回用户的选项。我想看看用户是否输入了任何一个键'A','W','K'。有了字典,我会说:while option not in author.items() option = get_option()
。如何使用元组列表完成此操作?
authors = [('A', "Aho"), ('W', "Weinberger"), ('K', "Kernighan")]
答案 0 :(得分:2)
authors = [('A', "Aho"), ('W', "Weinberger"), ('K', "Kernighan")]
option = get_option()
while option not in (x[0] for x in authors):
option = get_option()
这是如何运作的:
(x[0] for x in authors)
是一个生成器表达式,它从作者列表中逐个生成每个项目的[0]th
元素,然后该元素与option
匹配。一旦发现匹配,它就会短路并退出。
生成器表达式一次产生一个项目,因此内存效率也很高。
答案 1 :(得分:1)
像
这样的东西option in zip(*authors)[0]
我们正在使用zip
来基本上将字母与单词分开。然而,由于我们正在处理元组的列表,我们必须unpack使用*
:
>>> zip(*authors)
[('A', 'W', 'K'), ('Aho', 'Weinberger', 'Kernighan')]
>>> zip(*authors)[0]
('A', 'W', 'K')
然后,我们只需使用option in
来测试zip(*authors)[0]
中是否包含选项。
答案 2 :(得分:0)
这里有很好的答案,涵盖了使用zip
执行此操作,但您没有 这样做 - 您可以使用OrderedDict
代替。
from collections import OrderedDict
authors = OrderedDict([('A', "Aho"), ('W', "Weinberger"), ('K', "Kernighan")])
由于它会记住它的输入顺序,你可以迭代它,而不必担心键的奇怪或异常排序。