将python列表包装为切片操作

时间:2010-12-24 23:41:50

标签: python slice

考虑以下简单的python代码

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

我们可以按如下方式获取此数组的切片:

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

有没有办法绕过上面的数组转移到左边

[1, 2, 0]

只需使用切片操作?

4 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:2)

左:

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

右:

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

答案 2 :(得分:1)

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

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

没有这些组合可以提供尾部项目后跟初始项目的包装点。所以整个事情都无法创造。

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

答案 3 :(得分:0)

如果您对精确的切片语法没有过多的兴趣,则可以编写一个函数以产生所需的输出,包括包装行为。

例如,像这样:

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]

注意事项:您不能在slice assignment的左侧使用此提示。