【问题标题】:Invert slice in python在python中反转切片
【发布时间】:2012-10-18 09:38:46
【问题描述】:

有什么简单的方法可以在 python 中反转列表切片吗?给我所有的东西除了一片?例如:

鉴于列表a = [0,1,2,3,4,5,6,7,8,9],我希望能够提取[7,8,9,0,1,2],即除a[3:7]之外的所有内容。

从逻辑上考虑,我认为 a[-3:3] 会给我想要的,但它只返回一个空列表。

我更喜欢适用于 python 2 和 3 的解决方案

【问题讨论】:

标签: python list slice


【解决方案1】:

切片不会这样包装,但a[-3:] + a[:3] 会给你那个列表。

【讨论】:

  • 可惜,我希望他们会。有时它会很有帮助。
【解决方案2】:

如果你愿意销毁列表(或它的副本),你可以剪掉你不想要的部分:

>>> a = [0,1,2,3,4,5,6,7,8,9]
>>> a[3:7] = []
>>> a
[0, 1, 2, 7, 8, 9]

顺序与您要求的不同,尽管这对您来说可能并不重要。

【讨论】:

    【解决方案3】:

    Itertools 是你的朋友:

    itertools.islice(itertools.cycle(a),7,13)
    

    一般来说

    itertools.islice(itertools.cycle(a),gapEnd,len(a)-gapLen)
    

    这是一个生成器,因此您可以使用list(...) 获取列表,或者只是在循环中使用它。作为生成器,它不会创建列表的额外副本,也不会破坏原始列表等。

    >>> list(itertools.islice(itertools.cycle(a),7,13))
    [7, 8, 9, 0, 1, 2]
    

    【讨论】:

      【解决方案4】:
        1) b=a[7:10]+a[:3]
           [7, 8, 9, 0, 1, 2]
        2) c=list(set(a).difference([3,4,5,6]))
           [0, 1, 2, 7, 8, 9]
      
      
        3) lis=[i for i in a if i<3 or i >6]
           [0, 1, 2, 7, 8, 9]
      
         4) b=[3,4,5,6]
            c=[i for i in a if i not in b]
      

      【讨论】:

        【解决方案5】:

        顺序重要吗?

        >>> [j for i,j in enumerate(a) if not 3<=i<7]
        [0, 1, 2, 7, 8, 9]
        

        【讨论】:

          【解决方案6】:

          好的,所以这可能不是您想要的,但在您可能想要这样的切片的某些情况下很有用。

          有两个重要的免责声明。

          • 它不保持秩序
          • 删除重复项

          list(set(a).difference(a[3:7]))

          【讨论】:

            猜你喜欢
            • 2016-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-08
            • 1970-01-01
            • 1970-01-01
            • 2020-03-10
            • 1970-01-01
            相关资源
            最近更新 更多