高效查找二维元组

2 投票
4 回答
693 浏览
提问于 2025-04-15 18:15

下面这段代码有没有更简洁的一行替代方案?我相信一定有更聪明的方法。

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 个回答

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 示例 -- 比如典型的长度、没有可接受选项的可能性等等)。

6

你可以使用一个字典。

>>> choices = { 1: 'ONE', 2: 'TWO', 3: 'THREE' }
>>> label = choices[2]
>>> label
'TWO'
14
labels = dict(choices)
label = labels[some_int]

如果你不需要在其他地方使用labels,当然可以把这段代码合并成一行。

撰写回答