3

我已经声明了一个我想要操作的元组列表。我有一个返回用户选项的函数。我想看看用户是否输入了“A”、“W”、“K”键中的任何一个。有了字典,我会这样说:while option not in author.items() option = get_option(). 如何使用元组列表完成此操作?

authors = [('A', "Aho"), ('W', "Weinberger"), ('K', "Kernighan")]
4

3 回答 3

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. 一旦找到匹配,它就会短路并退出。

生成器表达式一次生成一项,因此内存效率很高。

于 2013-06-19T23:54:17.507 回答
1

像这样的东西怎么样

option in zip(*authors)[0]

我们zip用来从本质上将字母与单词分开。然而,由于我们正在处理一个元组列表,我们必须使用以下方法解包*

>>> zip(*authors)
[('A', 'W', 'K'), ('Aho', 'Weinberger', 'Kernighan')]
>>> zip(*authors)[0]
('A', 'W', 'K')

然后我们简单地使用option in来测试选项是否包含在zip(*authors)[0].

于 2013-06-19T23:45:55.323 回答
0

这里有很好的答案,涵盖了使用 进行此操作zip,但您不必那样- 您可以使用 anOrderedDict来代替。

from collections import OrderedDict
authors = OrderedDict([('A', "Aho"), ('W', "Weinberger"), ('K', "Kernighan")])

由于它会记住它的输入顺序,因此您可以对其进行迭代,而不必担心您的键会出现奇怪或不寻常的顺序。

于 2013-06-20T00:20:41.543 回答