Список Python / выбор подсписка -1 странность - PullRequest
31 голосов
/ 10 августа 2010

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

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

ls = range(1000)

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

ls[500:-1]

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

ls[0:10]

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

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

Ответы [ 6 ]

75 голосов
/ 10 августа 2010

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

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

14 голосов
/ 09 мая 2013

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

>>> 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]
4 голосов
/ 10 августа 2010

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

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

2 голосов
/ 10 августа 2010

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

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

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

1 голос
/ 10 августа 2010

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

ls[y:x]  

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

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

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

1 голос
/ 10 августа 2010

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