【问题标题】:Python (2.x) list / sublist selection -1 weirdnessPython(2.x)列表/子列表选择-1怪异
【发布时间】:2011-03-27 22:35:09
【问题描述】:

所以我一直在玩 python 并注意到一些似乎有点奇怪的东西。 -1 从列表中选择的语义似乎不一致。

所以我有一个数字列表

ls = range(1000)

列表的最后一个元素当然是ls[-1],但如果我采用它的子列表,这样我就可以得到从中点到结尾的所有内容

ls[500:-1]

但这并没有给我一个包含列表中最后一个元素的列表,而是一个包含直到最后一个元素的所有内容的列表。但是,如果我这样做了

ls[0:10]

我得到一个包含第十个元素的列表(所以选择器应该包含在内),为什么它不适用于-1。

我当然可以使用ls[500:] 或ls[500:len(ls)](这很愚蠢)。我只是想知道与 -1 的交易是什么,我意识到我在那里不需要它。

【问题讨论】:

  • 请注意,这是一个较老的问题,并且某些行为特定于 python2。在 python3 中,等价于 ls = list(range(1000))

标签: list python-2.x sublist


【解决方案1】:

如果你想得到一个包含最后一个元素的子列表,你可以在冒号后面留空:

>>> ll=range(10)
>>> ll
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ll[5:]
[5, 6, 7, 8, 9]
>>> ll[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

【讨论】:

    【解决方案2】:

    在list[first:last] 中,不包括last。

    第 10 个元素是ls[9],在ls[0:10] 中没有ls[10]。

    【讨论】:

      【解决方案3】:

      -1 在序列被向后读取的意义上并不特殊,它更确切地说是环绕两端。这样减一表示零减一,排他(并且,对于正步长值,序列“从左到右”读取。

      所以对于i = [1, 2, 3, 4],i[2:-1] 表示从第 2 项到 开头减一(或者,'从周围到结尾'),结果为 @ 987654323@。 第 -1 个元素,或元素 0 向后 1 是最后一个 4,但由于它是独占的,所以我们得到 3。

      我希望这有点可以理解。

      【讨论】:

        【解决方案4】:

        两个实例的行为一致:

        >>> ls[0:10]
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        >>> ls[10:-1]
        [10, 11, 12, 13, 14, 15, 16, 17, 18]
        

        但请注意,列表的第十个元素位于索引 9 处,因为该列表是从 0 开始索引的。那可能就是你挂断电话的地方。

        换句话说,[0:10] 不会从索引 0-10 开始,它实际上是从 0 到第 10 个元素(这会让您获得 0-9 的索引,因为 10 在切片末尾不包含在内)。

        【讨论】:

          【解决方案5】:

          对数组进行切片时;

          ls[y:x]  
          

          从元素 y 到 x 的切片,但不包括 x。当您使用负索引时,它相当于使用

          ls[y:-1] == ls[y:len(ls)-1]
          

          所以切片会一直到最后一个元素,但它不会包含它(根据切片)

          【讨论】:

            【解决方案6】:

            对我来说似乎很一致;正指数也不包括在内。我认为你做错了。请记住 range() 也是不包含在内的,并且 Python 数组是 0 索引的,这里有一个示例 Python 会话来说明:

            >>> d = range(10)
            >>> d
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
            >>> d[9]
            9
            >>> d[-1]
            9
            >>> d[0:9]
            [0, 1, 2, 3, 4, 5, 6, 7, 8]
            >>> d[0:-1]
            [0, 1, 2, 3, 4, 5, 6, 7, 8]
            >>> len(d)
            10
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-07-01
              • 2019-07-06
              • 1970-01-01
              • 1970-01-01
              • 2012-11-03
              • 2018-02-17
              • 2022-10-04
              • 2017-03-26
              相关资源
              最近更新 更多