Таким образом, я играл вокруг с Python и заметил что-то, что кажется немного нечетным. Семантика -1
в выборе из списка, кажется, не последовательны.
Таким образом, у меня есть список чисел
ls = range(1000)
Последний элемент списка, если, конечно, ls[-1]
но если я беру подсписок того, что так, чтобы я добрался, все от говорит, что средняя точка в конец я сделал бы
ls[500:-1]
но это не дает мне список, содержащий последний элемент в списке, но вместо этого списке, содержащем все ДО последнего элемента. Однако, если я делаю
ls[0:10]
Я получаю список, содержащий также десятый элемент (таким образом, селектор должен быть содержащим), почему затем делает это не, работают на -1
.
Я могу, конечно, сделать ls[500:]
или ls[500:len(ls)]
(который был бы глуп). Я просто задавался вопросом, каково соглашение с-1 было, я понимаю, что мне не нужно оно там.
В список [первый: последний]
, последний
не включен.
Десятый элемент - ls [9]
, в ls [0:10]
нет ls [10]
.
-1 не является чем-то особенным в том смысле, что последовательность читается в обратном направлении, она скорее охватывает концы. Таким образом, минус один означает ноль минус один, исключая (и, для положительного значения шага, последовательность читается «слева направо».
поэтому для i = [1, 2] , 3, 4]
, i [2: -1]
означает от пункта два до начало минус один (или «примерно до конца») , что приводит к [3]
.
-1-й элемент, или элемент 0 в обратном направлении 1 - это последний 4
, но поскольку он исключительный, мы получаем 3.
Надеюсь, это в некоторой степени понятно.
при нарезке массива;
ls[y:x]
берет срез от элемента y до x, но не включая x. При использовании отрицательной индексации это эквивалентно использованию
ls[y:-1] == ls[y:len(ls)-1]
так что срез будет до последнего элемента, но не включая его (согласно срезу)
.Я получаю согласованное поведение для обоих экземпляров:
>>> 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:10]
не идет от индекса 0-10, он фактически переходит от 0 к десятому элементу (что дает вам индексы 0-9, поскольку 10 - это не включительно в конце среза).
Мне это кажется довольно последовательным; положительные индексы также не являются исчерпывающими. Я думаю, вы делаете это неправильно. Помня, что 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