假设我想从Python中的列表中获取第一个元素,第3个到第200个元素,以及通过步骤大小3的最后一个元素的第201个元素.
一种方法是使用不同的索引和连接:
new_list = old_list[0:1] + old_list[3:201] + old_list[201::3]
Run Code Online (Sandbox Code Playgroud)
有没有办法只用一个索引来做到这一点old_list?我想要类似下面的内容(我知道这在语法上不起作用,因为列表索引不能是列表,因为Python遗憾的是没有切片文字 ;我只是在寻找接近的东西):
new_list = old_list[[0, 3:201, 201::3]]
Run Code Online (Sandbox Code Playgroud)
我可以通过切换到NumPy数组来实现其中的一些功能,但我对如何为原生Python列表执行此操作更感兴趣.我也可以创建一个切片制作器或类似的东西,并可能强大的手臂给我一个等效的切片对象来表示我所有我想要的切片的组成.
但我正在寻找一些不涉及创建新类来管理切片的东西.我想简单地连接切片语法并将其提供给我的列表,让列表理解它意味着分别获取切片并最终连接各自的结果.
切片制作者对象(例如SliceMaker来自您的其他问题或者np.s_)可以接受多个以逗号分隔的切片; 它们被接收为tuple的sliceS或其它目的:
from numpy import s_
s_[0, 3:5, 6::3]
Out[1]: (0, slice(3, 5, None), slice(6, None, 3))
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8382 次 |
| 最近记录: |