假设我想要 Python 列表中的第一个元素、第 3 个元素到第 200 个元素以及第 201 个元素到最后一个元素,步长为 3。
一种方法是使用不同的索引和连接:
new_list = old_list[0:1] + old_list[3:201] + old_list[201::3]
有没有办法只用 old_list
上的一个索引来做到这一点?我想要类似以下内容(我知道这在语法上不起作用,因为列表索引不能是列表,而且不幸的是 Python doesn't have slice literals ;我只是在寻找接近的东西):
new_list = old_list[[0, 3:201, 201::3]]
我可以通过切换到 NumPy 数组来实现其中的一些,但我更感兴趣的是如何为原生 Python 列表做到这一点。我还可以创建 a slice maker或类似的东西,可能还有强壮的 ARM ,给我一个等效的切片对象来表示我想要的所有切片的组成。
但我正在寻找不涉及创建新类来管理切片的东西。我只想连接切片语法并将其提供给我的列表,并让列表理解这意味着分别获取切片并最终连接它们各自的结果。
最佳答案
切片器对象(例如来自您其他问题的 SliceMaker
,或 np.s_
)可以接受多个以逗号分隔的切片;它们作为 slice
或其他对象的 tuple
接收:
from numpy import s_
s_[0, 3:5, 6::3]
Out[1]: (0, slice(3, 5, None), slice(6, None, 3))
NumPy 将其用于多维数组,但您可以将其用于切片连接:
def xslice(arr, slices):
if isinstance(slices, tuple):
return sum((arr[s] if isinstance(s, slice) else [arr[s]] for s in slices), [])
elif isinstance(slices, slice):
return arr[slices]
else:
return [arr[slices]]
xslice(list(range(10)), s_[0, 3:5, 6::3])
Out[1]: [0, 3, 4, 6, 9]
xslice(list(range(10)), s_[1])
Out[2]: [1]
xslice(list(range(10)), s_[:])
Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
关于Python:带有间隙的切片的语法更短?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842060/