代码之家  ›  专栏  ›  技术社区  ›  Matti Lyra

Python列表/子列表选择-1古怪

  •  29
  • Matti Lyra  · 技术社区  · 14 年前

    所以我一直在玩python,注意到一些看起来有点奇怪的东西。语义学 -1

    所以我有一个数字列表

    ls = range(1000)
    

    当然,如果 ls[-1]

    ls[500:-1]
    

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

    ls[0:10]
    

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

    我当然可以 ls[500:] ls[500:len(ls)] (这太傻了)。我只是想知道-1的交易是什么,我意识到我不需要它。

    6 回复  |  直到 14 年前
        1
  •  99
  •   pfnuesel    10 年前

    list[first:last] last 不包括在内。

    第十个元素是 ls[9] ls[0:10] 没有 ls[10] .

        2
  •  22
  •   mcane    9 年前

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

    >>> 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]
    
        3
  •  4
  •   eldarerathis sreeji    14 年前

    >>> 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到第十个元素(这会得到索引0到9,因为10在片的末尾不是包含的)。

        4
  •  2
  •   Yoni Samlan    14 年前

    在我看来,这是相当一致的;正指数也不包含在内。我觉得你做错了。记住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
    
        5
  •  2
  •   Andy    14 年前

    切片数组时;

    ls[y:x]  
    

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

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

    所以它是这样的,所以切片将是最后一个元素,但它不会包括它(根据切片)

        6
  •  2
  •   Stefano Palazzo    14 年前

    -1并不特别,因为序列是向后读取的,而是围绕着末端。以至于 减一意味着零减一,不包括在内 (并且,对于正阶跃值,序列被读取为“从左到右”。

    所以对于 i = [1, 2, 3, 4] i[2:-1] 方法 从第二项到 开头减去一(或“从一开始到结尾”) ,导致 [3] . 0向后1 是最后一个 4 但是因为是独家的,我们有3个。