我有以下代码:
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]
Run Code Online (Sandbox Code Playgroud)
基本上,我计算一个新索引并使用它来从列表中查找一些元素.为了确保索引在列表的边界内,我需要将这两个if
语句写成4行.那是相当冗长,有点难看......我敢说,这是非常不科幻的.
还有其他更简单,更紧凑的解决方案吗?(和更多pythonic)
是的,我知道我可以if else
在一行中使用,但它不可读:
new_index = 0 if new_index < 0 else len(mylist) - 1 if new_index >= len(mylist) else new_index
Run Code Online (Sandbox Code Playgroud)
我也知道我可以链max()
和min()
在一起.它更紧凑,但我觉得它有点模糊,如果我输错了就更难找到错误.换句话说,我觉得这很简单.
new_index = max(0, min(new_index, len(mylist)-1))
Run Code Online (Sandbox Code Playgroud) 我正在尝试用默认值替换低于和高于阈值的“坏值”(例如将它们设置为 NaN)。 \n我正在取消具有 1000k 值及更多值的 numpy 数组 - 因此性能是一个问题。
\n\n我的原型分两步进行操作,是否可以一步完成此操作?
\n\nimport numpy as np\n\ndata = np.array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])\n\nupper_threshold = 7\nlower_threshold = 1\ndefault_value = np.NaN\n\n# is it possible to do this in one expression?\ndata[data > upper_threshold] = default_value\ndata[data < lower_threshold] = default_value\n\nprint data # [ nan 1. 2. 3. 4. 5. 6. 7. nan nan]\n
Run Code Online (Sandbox Code Playgroud)\n\n正如这个相关问题中所评论的(用上限和下限替换列表值的Pythonic way(钳制、剪裁、阈值处理)?)
\n\n\n与许多其他函数一样,np.clip 是 python 的,但它遵循 arr.clip 方法。对于常规数组,该方法是编译的,因此速度会更快(大约 2 倍)。\xe2\x80\x93 hpaulj
\n …