Если вы хотите порезать справа налево, что вам нужно для обеспечения отрицательного значения step
: sample_list[-2:2:-1]
. Это также изменит порядок значений.
И кусочек, как [-2:2]
, не имеет смысла. Если вы делаете sample_list[-2:2]
в списке длины два, вы получите копию всего. В списке длиной три вы получите фрагмент с только средним элементом. Это только для списков длиной 4 или больше, вы получаете пустой фрагмент. Если они автоматически перевернутся, то некоторые из этих случаев будут неоднозначными.
Редактировать: Позвольте мне попытаться сделать более полное объяснение.
Синтаксис среза Python реализуется объектами slice
. То есть L[start:stop:step]
эквивалентен L[slice(start, stop, step)]
. (Ну, вот как это работает на Python 3.Для обратной совместимости причин Python 2 также имеет более старый подход, используя __getslice__
и __setslice__
методы, но новый способ с slice
объектами тоже работает.)
Когда вы берете кусок или список или кортеж, вы всегда получаете элементы, начиная с индекс start
и продолжение до элемента непосредственно перед stop
. Параметр step
описывает размер выполненных шагов: 2
означает каждое другое значение, а -1
означает шаги в обратном порядке.
Другим способом мышления является то, что срез L[start:stop:step]
почти эквивалентен пониманию списка [L[i] for i in range(start, stop, step)]
. Различия заключаются только в том, что происходит, когда некоторые из значений отрицательны или не указаны.
Правило для обработки отрицательных значений легко (и это то же самое, что и для нерезкой индексации). Для start
и stop
просто добавьте длину последовательности к любому отрицательному значению. Таким образом, для положительных x
и y
срез L[-x:-y]
в точности эквивалентен L[len(L)-x:len(L)-y]
. Отрицательные значения step
не преобразуются.
В отличие от обычного индексации, нарезка никогда не вызывает исключений для индексов вне диапазона. Если индексы недействительны, вы можете получить пустой результат или несколько меньше значений, чем запрашивал срез.
Не все аргументы для фрагмента требуются. A slice
Конструктор объекта присваивает None
значения по умолчанию для любого аргумента, не предоставленного. Что означают эти None
s для start
и stop
, отличается в зависимости от знака step
, а также от размеров списка, который нарезается.
Если step
is None
, он всегда обрабатывается, как если бы он был 1
. Если step
является положительным (или None
), значение start
None
обрабатывается так, как если бы оно было 0
, а значение stop
None
обрабатывается как len(L)
. Если step
отрицательный, значение start
None
обрабатывается как -1
и stop
Значение None
рассматривается как -len(L)-1
.
Таким образом, чтобы обвести на ваш вопрос, когда вы делаете срез sample_list[-2:2]
, происходит несколько вещей:
Первый выключен, slice
объект создается, как если бы вы сделали slice(-2, 2)
. Этот объект среза будет иметь step
None
, так как вы не указали третье значение.
Далее slice
передается в список и значения интерпретируются. С step
был None
, используется значение по умолчанию 1
. Поскольку start
отрицательный, к нему добавляется длина списка.
И, наконец, результаты вычисляются. Для вашего списка примеров с семью значениями вы получите эквивалент [sample_list[i] for i in range(5, 2, 1)]
. Поскольку диапазон пуст, срез тоже.
В зависимости от того, что вы хотели, вы можете исправить это несколькими способами.Вы можете оставить это, и вы получите результаты только для очень коротких списков источников, где len(L)-2
меньше, чем 2
. В качестве альтернативы вы можете поменять порядок своих первых двух аргументов и получить результат [3,4,5]
. Или вы можете добавить отрицательный step
и срез справа налево, в результате получится [6, 5, 4]
.
Подсказка: что он печатает, если вы делаете 'sample_list [-2:]'? Также посмотрите [этот вопрос] (http://stackoverflow.com/questions/509211/the-python-slice-notation) –
В 'sample_list [x: y]' индекс x является нижней границей и y является верхней. вы делаете 'sampe_list [-2: 2]', но в списке сначала появляется элемент с индексом 2. –
@BurhanKhalid ссылка, безусловно, полезна. На самом деле, один из сообщений несколько отвечает на мои сомнения в том, почему я получаю пустые списки, а не ошибку: «Python доволен программисту (если предметов меньше, чем вы просите. Например, если вы попросите a [: - 2] и содержит только один элемент), вы получаете пустой список вместо ошибки. " – dkumar