Список Python / выбор подсписка -1 странность

Итак, я играл с python и заметил кое-что, что кажется немного странным. Семантика -1 при выборе из списка не кажется последовательным.

Итак, у меня есть список чисел

ls = range(1000)

последний элемент списка, если конечно ls[-1] но если я возьму подлист этого, чтобы я получил все от середины до конца, я бы сделал

ls[500:-1]

но это не дает мне список, содержащий последний элемент в список, но вместо этого список, содержащий все до последнего элемента. Однако, если я это сделаю

ls[0:10]

Я получаю список, содержащий также десятый элемент (поэтому селектор должен быть включительным), почему тогда он не работает для -1.

Я конечно могу сделать ls[500:] или ls[500:len(ls)] (что было бы глупо). Мне просто интересно, в чем дело с -1, Я понимаю,что мне это не нужно.

6 ответов


на list[first:last], last не входит.

10-й элемент ls[9], в ls[0:10] нет ls[10].


Если вы хотите получить sub список, включая последний элемент, вы оставляете пробел после двоеточия:

>>> 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]

Я получаю последовательное поведение для обоих случаях:

>>> 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]

обратите внимание, что десятый элемент списка находится в index 9, так как список 0-индексируется. Возможно, именно там ты и повесил трубку.

другими словами, [0:10] не идет от индекса 0-10, он эффективно переходит от 0 к десятому элементу (который получает индексы 0-9, так как 10 не включен в конце среза).


-1 не является особенным в том смысле, что последовательность читается назад, она скорее обертывается вокруг концов. Такой, что минус один означает ноль минус один, эксклюзивный (и для положительного значения шага последовательность читается "слева направо".

и i = [1, 2, 3, 4], i[2:-1] означает из пункта два к начало минус один (или "вокруг до конца"), в результате [3]. -1-й элемент, или элемент 0 назад 1 - это последний 4, но так как это эксклюзивно, мы получаем 3.

Я надеюсь, что это несколько понятно.


это кажется мне довольно последовательным; положительные индексы также не включают. Я думаю, ты делаешь это неправильно. Помня, что 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

при нарезке массива;

ls[y:x]  

берет срез от элемента y до и, но не включая x. при использовании отрицательной индексации это эквивалентно использованию

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

таким образом, срез будет до последнего элемента, но он не будет включать его (согласно срезу)