Python 高效搜索二元组

Python 高效搜索二元组,python,tuples,Python,Tuples,以下代码的最佳单行程序替换方案是什么?我相信有更聪明的方法 choices = ((1, 'ONE'), (2, 'TWO'), (3, 'THREE')) some_int = 2 for choice in choices: if choice[0] == some_int: label = choice[1] break; # label == 'TWO' 你可以用听写器 >>> choices = { 1: 'ONE', 2:

以下代码的最佳单行程序替换方案是什么?我相信有更聪明的方法

choices = ((1, 'ONE'), (2, 'TWO'), (3, 'THREE'))
some_int = 2
for choice in choices:
    if choice[0] == some_int:
        label = choice[1]
        break;
# label == 'TWO'
你可以用听写器

>>> choices = { 1: 'ONE', 2: 'TWO', 3: 'THREE' }
>>> label = choices[2]
>>> label
'TWO'

当然,如果您不需要任何其他地方的
标签,您可以将其加入到一行程序中。

如果您真的在寻找一行程序

label = dict(choices)[some_int]
就是

>>> choices = ((1, 'ONE'), (2, 'TWO'), (3, 'THREE'))
>>> dict(choices)[1]
'ONE'

对于一次性搜索,如果您致力于从该数据结构开始,并且无法分摊将其构建到字典中所需的时间,并且不知道起始结构是否已排序(因此对分搜索不是选项),那么没有比简单线性搜索更快的算法。您可以优雅地表达它,例如在Python 2.6或更高版本中:

label = next((lab for cho, lab in choices if cho==someint), None)
假设您希望标签为
None
,如果没有匹配的选项,或者如果您希望在这种情况下引发异常,只需

label = next(lab for cho, lab in choices if cho==someint)
或者在较旧的Python版本中

label = (lab for cho, lab in choices if cho==someint).next()

但我怀疑性能会有很大的变化(如果您愿意的话,可以用
timeit
轻松测量,但在这种情况下,您需要提供一些
选择的实际示例
——典型长度、无法接受选择的可能性等).

数据结构是一个两元组,因为这是您在Django中定义字段选项的方式。如果某个
选项[0]
出现两次会发生什么?你要第一个还是最后一个?请注意,
dict(选项)
方法将使用最后一个-
dict(反转(选项))
将给出第一个选项(如果有必要)。
label = (lab for cho, lab in choices if cho==someint).next()