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