Сторнирование списка с использованием обозначения среза - PullRequest
54 голосов
/ 04 мая 2011

в следующем примере:

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] не печатает весь список?

Ответы [ 5 ]

103 голосов
/ 04 мая 2011

Краткая запись среза:

[ <first element to include> : <first element to exclude> : <step> ]

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

foo[::-1]

Вы можететакже найдите некоторую хорошую информацию о срезах Python в целом здесь:
Объясните обозначение срезов Python

8 голосов
/ 30 июня 2016

Если у вас возникли проблемы с запоминанием обозначения фрагмента, попробуйте ввести Hokey Cokey :

[ In : Out : встряхните все о ]

[Первый элемент в в Включите: Первый элемент, чтобы оставить в : шаг виспользовать]

ГММВ

6 голосов
/ 04 мая 2011

... почему foo [6: 0: -1] не печатает весь список?

Поскольку среднее значение является исключительным , а не включающим, стоп-значением. Обозначение интервала равно [начало, остановка).

Именно так работает диапазон [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 голосов
/ 05 декабря 2015

Этот ответ может быть немного устаревшим, но он может быть полезен для тех, кто застрял с той же проблемой.Вы можете получить обратный список с произвольным окончанием - до 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]
1 голос
/ 22 сентября 2018

Использование

>>>foo[::-1]

Отображает обратную сторону списка от конечного элемента к началу,

...