有效地搜索二元组

时间:2010-01-20 19:00:37

标签: 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'

4 个答案:

答案 0 :(得分:14)

labels = dict(choices)
label = labels[some_int]
当然,如果你在其他任何地方都不需要labels,你可以将它加入到单行中。

答案 1 :(得分:6)

你可以使用词典。

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

答案 2 :(得分:5)

对于一次性搜索,如果您承诺从该数据结构开始并且不能分摊将其构建到字典中所花费的时间,并且不知道起始结构是否已排序(因此那种二分搜索不是一种选择),没有比简单线性搜索快得多的算法。你可以优雅地表达它,例如在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进行测量,但在这种情况下你需要提供choices的一些实际例子 - 典型的长度,没有选择的机会是可以接受的等等。)

答案 3 :(得分:3)

如果你真的在寻找一个班轮......

label = dict(choices)[some_int]

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