【问题标题】:Wrapping around a list as a slice operation将列表包装为切片操作
【发布时间】:2011-05-30 13:09:42
【问题描述】:

考虑以下简单的python代码

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

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

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

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

[1, 2, 0]

只需使用切片操作?

【问题讨论】:

  • 上面的数组 - 这不是一个数组,它是一个list。至少你的标题是正确的。 :)
  • 您是要修改 L 还是要在 L 上提供迭代器?

标签: python slice


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    左:

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

    对:

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

    【讨论】:

      【解决方案3】:

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

      • 一个正的起始索引会去掉一些初始项目。
      • 负的起始索引会为您提供一些尾部项目,再次削减初始项目。
      • 正整理索引会去掉一些尾部项目。
      • 负的整理索引会为您提供一些初始项目,再次削减尾部项目。

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

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

      【讨论】:

        【解决方案4】:

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

        例如,像这样:

        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 的左侧使用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-16
          • 2020-03-14
          • 2011-01-14
          • 1970-01-01
          • 1970-01-01
          • 2013-12-23
          • 2011-05-30
          相关资源
          最近更新 更多