Ответ 1
В list[first:last]
, last
не входит.
10-й элемент ls[9]
, в ls[0:10]
нет ls[10]
.
Итак, я играл с питоном и замечал нечто странное. Семантика -1
при выборе из списка не кажется последовательной.
Итак, у меня есть список чисел
ls = range(1000)
Последний элемент списка, если, конечно, ls[-1]
, но если я возьму подсписку из этого, чтобы получить все, от середины до конца, я бы сделал
ls[500:-1]
но это не дает мне список, содержащий последний элемент в списке, а вместо него список, содержащий все до последнего элемента. Однако, если я делаю
ls[0:10]
Я получаю список, содержащий также десятый элемент (поэтому селектор должен быть включенным), почему тогда он не работает для -1
.
Я могу, конечно, сделать ls[500:]
или ls[500:len(ls)]
(что было бы глупо). Мне просто интересно, что такое сделка с -1, я понимаю, что мне это не нужно.
В list[first:last]
, last
не входит.
10-й элемент ls[9]
, в ls[0:10]
нет ls[10]
.
Если вы хотите получить дополнительный список, включая последний элемент, вы оставите пустой после двоеточия:
>>> 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]
Обратите внимание, что этот десятый элемент списка имеет индекс 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]
так что так, чтобы срез был до последнего элемента, но он не включал бы его (в соответствии с срезом)