【发布时间】:2021-12-02 20:43:18
【问题描述】:
我有以下代码:
new_index = index + offset
if new_index < 0:
new_index = 0
if new_index >= len(mylist):
new_index = len(mylist) - 1
return mylist[new_index]
基本上,我计算一个新索引并使用它从列表中查找一些元素。为了确保索引在列表的范围内,我需要将这 2 个 if 语句写成 4 行。这很冗长,有点难看...我敢说,这很un-pythonic。
还有其他更简单、更紧凑的解决方案吗?(以及更多pythonic)
是的,我知道我可以在一行中使用if else,但它不可读:
new_index = 0 if new_index < 0 else len(mylist) - 1 if new_index >= len(mylist) else new_index
我也知道我可以将max() 和min() 链接在一起。它更紧凑,但我觉得它有点晦涩,如果我输入错误更难找到错误。换句话说,我觉得它不是很简单。
new_index = max(0, min(new_index, len(mylist)-1))
【问题讨论】:
-
如果感觉“有点晦涩难懂”,就用它做一个函数?
-
是的,我可以写一个函数,但这不是重点。问题是如何实现它(内联或在函数中)。
-
clamp = lambda value, minv, maxv: max(min(value, maxv), minv)使用来自arma.sourceforge.net/docs.html#clamp的API