高效查找二维元组
下面这段代码有没有更简洁的一行替代方案?我相信一定有更聪明的方法。
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
,当然可以把这段代码合并成一行。