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

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

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

ls = range(1000)

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

ls[500:-1]

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

ls[0:10]

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

Я получаю согласованное поведение для обоих экземпляров:

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

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

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

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

Ответ 5

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

Ответ 6

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

ls[y:x]  

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

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

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