Python:带有间隙的切片的语法更短?

标签 python slice

假设我想要 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/

相关文章:

python - 使用 PyQt5 渲染 Markdown

Python:如何将特定数量字符的字符串切片到列表中?

go - 将数据发送到 channel slice 中的 channel 时出现死锁

go - 如何在golang中将 slice 附加到字节数组

python - 大于缓冲页 1/3 的值无法编入索引 Django 错误

python - Django:具有多级嵌套的查询集过滤器

arrays - 根据数据中的关系对数组进行切片(在 Ruby 中)

python - 从 numpy 数组中获取最大或最小 n 个元素? (最好不要压平)

Python Pandas 日期时间索引创建数据框

python - 使用 exec() 执行的代码中定义的函数范围