以下代码的最佳单线代替是什么?我确信这是一种更聪明的方式.
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'
Run Code Online (Sandbox Code Playgroud)
Sil*_*ost 14
labels = dict(choices)
label = labels[some_int]
Run Code Online (Sandbox Code Playgroud)
当然,如果你不需要labels其他任何东西,你可以将它加入到单行中.
你可以用dict.
>>> choices = { 1: 'ONE', 2: 'TWO', 3: 'THREE' }
>>> label = choices[2]
>>> label
'TWO'
Run Code Online (Sandbox Code Playgroud)
对于一次性搜索,如果您承诺从该数据结构开始并且无法分摊将其构建到字典中所花费的时间,并且不知道起始结构是否已排序(以便二等分 - 搜索不是一种选择),没有比简单线性搜索快得多的算法.您可以优雅地表达它,例如在Python 2.6或更高版本中:
label = next((lab for cho, lab in choices if cho==someint), None)
Run Code Online (Sandbox Code Playgroud)
假设您希望标签None在没有选择匹配的情况下 - 或者如果您希望在这种情况下引发异常,那么就是
label = next(lab for cho, lab in choices if cho==someint)
Run Code Online (Sandbox Code Playgroud)
或者在较旧的Python版本中
label = (lab for cho, lab in choices if cho==someint).next()
Run Code Online (Sandbox Code Playgroud)
但是我怀疑性能会有多大变化(timeit如果你关心的话很容易衡量,但在这种情况下,你需要提供一些现实的例子choices- 典型的长度,不可接受的机会,等等).
| 归档时间: |
|
| 查看次数: |
668 次 |
| 最近记录: |