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

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

Таким образом, у меня есть список чисел

ls = range(1000)

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

ls[500:-1]

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

ls[0:10]

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

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

36
задан Matti Lyra 10 August 2010 в 16:23
поделиться

5 ответов

В список [первый: последний] , последний не включен.

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

82
ответ дан 27 November 2019 в 05:19
поделиться

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

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

Надеюсь, это в некоторой степени понятно.

2
ответ дан 27 November 2019 в 05:19
поделиться

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

ls[y:x]  

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

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

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

.
2
ответ дан 27 November 2019 в 05:19
поделиться

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

>>> 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 - это не включительно в конце среза).

4
ответ дан 27 November 2019 в 05:19
поделиться

Мне это кажется довольно последовательным; положительные индексы также не являются исчерпывающими. Я думаю, вы делаете это неправильно. Помня, что 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
1
ответ дан 27 November 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: