Реверсивный список с использованием нотации среза
в следующем примере:
foo = ['red', 'white', 'blue', 1, 2, 3]
где: foo[0:6:1]
будет печатать все элементы в foo. Однако foo[6:0:-1]
опускает 1-й или 0-й элемент.
>>> foo[6:0:-1]
[3, 2, 1, 'blue', 'white']
Я понимаю, что я могу использовать foo.reverse() или foo [:: - 1], чтобы распечатать список в обратном порядке, но я пытаюсь понять, почему foo [6: 0: -1] не печатает весь список?
Ответы
Ответ 1
Обозначение фрагмента:
[ <first element to include> : <first element to exclude> : <step> ]
Если вы хотите включить первый элемент при перестановке списка, оставьте средний элемент пустым, например:
foo[::-1]
Вы также можете найти полезную информацию о кусочках Python в целом здесь:
Объяснить нотацию фрагмента Python
Ответ 2
... почему foo [6: 0: -1] не распечатывает весь список?
Поскольку среднее значение является исключительным, а не включенным, значением стоп-значения. интервальная нотация - [start, stop).
Именно так работает диапазон [x]:
>>> range(6, 0, -1)
[6, 5, 4, 3, 2, 1]
Это индексы, которые включаются в ваш результирующий список, и они не включают 0 для первого элемента.
>>> range(6, -1, -1)
[6, 5, 4, 3, 2, 1, 0]
Другой способ взглянуть на это:
>>> L = ['red', 'white', 'blue', 1, 2, 3]
>>> L[0:6:1]
['red', 'white', 'blue', 1, 2, 3]
>>> len(L)
6
>>> L[5]
3
>>> L[6]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Индекс 6 находится за пределами (одно прошлое, точно) допустимых индексов для L, поэтому исключая его из диапазона как исключенное стоп-значение:
>>> range(0, 6, 1)
[0, 1, 2, 3, 4, 5]
Показывает индексы для каждого элемента в списке.
Ответ 3
Если у вас возникли проблемы с запоминанием нотации среза, вы можете попробовать сделать Hokey Cokey:
[ В: Вывод: Встряхните все это)
[Первый элемент в: первый элемент, чтобы оставить вне: шаг)
YMMV
Ответ 4
Этот ответ может быть немного устаревшим, но он может быть полезен для тех, кто сталкивался с одинаковой проблемой.
Вы можете получить обратный список с произвольным индексом конца до 0, применяя второй локальный срез следующим образом:
>>> L = list(range(10))
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (start_ex, end) = (7, 0)
>>> L[end:start_ex][::-1]
[6, 5, 4, 3, 2, 1, 0]