繁体   English   中英

将列表包装为切片操作

[英]Wrapping around a list as a slice operation

考虑以下简单的python代码

>>> L = range(3)
>>> L
[0, 1, 2]

我们可以对这个数组进行切片,如下所示:

>>> L[1:3]
[1, 2]

有没有办法通过向左移动来环绕上面的数组

[1, 2, 0]

通过简单地使用切片操作?

向左旋转n元素(或向右旋转负 n):

L = L[n:] + L[:n]

请注意, collections.deque支持旋转 使用它而不是列表可能会更好。

剩下:

L[:1], L[1:] = L[-1:], L[:-1]

对:

L[-1:], L[:-1] = L[:1], L[1:]

在我看来,没有办法,除非您同意如上所示剪切和连接列表。 要进行您描述的包装,您需要更改起始索引和结束索引。

  • 正的起始指数会削减一些初始项目。
  • 负起始索引为您提供一些尾部项目,再次切割初始项目。
  • 积极的整理指数削减了一些尾部项目。
  • 负整理指数为您提供一些初始项目,再次切割尾部项目。

这些的组合都不能提供尾部项目后跟初始项目的包装点。 所以不能创建整个事物。

存在多种解决方法。 如果您需要顺序访问(例如在循环中),请参阅上面的答案,另请参阅itertools.islice.chain以了解无复制顺序方法。

如果您不太依赖于精确的切片语法,您可以编写一个函数来产生所需的输出,包括包装行为。

例如,像这样:

def wrapping_slice(lst, *args):
    return [lst[i%len(lst)] for i in range(*args)]

示例输出:

>>> L = range(3)
>>> wrapping_slice(L, 1, 4)
[1, 2, 0]
>>> wrapping_slice(L, -1, 4)
[2, 0, 1, 2, 0]
>>> wrapping_slice(L, -1, 4, 2)
[2, 1, 0]

警告:您不能在切片分配的左侧使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM