Мне нужно хорошее объяснение (ссылки плюс) на нотации Python.
Мне эта запись нуждается в небольшом подборе.
Это выглядит очень мощно, но я не совсем понял, где это.
Это довольно просто на самом деле:
a[start:stop] # items start through stop-1
a[start:] # items start through the rest of the array
a[:stop] # items from the beginning through stop-1
a[:] # a copy of the whole array
Также есть step
значение, которое можно использовать с любым из вышеперечисленных:
a[start:stop:step] # start through not past stop, by step
Ключевой момент, который следует запомнить, - это то, что :stop
значение представляет собой первое значение, которого нет в выбранном срезе. Таким образом, разница между stop
и start
является количеством выбранных элементов (если step
1, по умолчанию).
Другая особенность заключается в том, что start
или stop
может быть отрицательным числом, что означает, что оно отсчитывается от конца массива, а не от начала. Так:
a[-1] # last item in the array
a[-2:] # last two items in the array
a[:-2] # everything except the last two items
Аналогично step
может быть отрицательное число:
a[::-1] # all items in the array, reversed
a[1::-1] # the first two items, reversed
a[:-3:-1] # the last two items, reversed
a[-3::-1] # everything except the last two items, reversed
Python добр к программисту, если в нем меньше элементов, чем вы просите. Например, если вы запрашиваете a[:-2]
и a
содержит только один элемент, вместо ошибки вы получите пустой список. Иногда вы бы предпочли ошибку, поэтому вы должны знать, что это может произойти.
slice()
объектуОператор среза []
фактически используется в приведенном выше коде с slice()
объектом с использованием :
нотации (которая действительна только внутри []
), то есть:
a[start:stop:step]
эквивалентно:
a[slice(start, stop, step)]
Объекты среза также ведут себя немного по-разному в зависимости от количества аргументов, аналогично range()
, то есть оба slice(stop)
и slice(start, stop[, step])
поддерживаются. Чтобы пропустить указание заданного аргумента, можно использовать None
, например a[start:]
, эквивалентно a[slice(start, None)]
или a[::-1]
эквивалентно a[slice(None, None, -1)]
.
Хотя :
нотация на основе очень полезна для простого среза, явное использование slice()
объектов упрощает программную генерацию среза.
None
любое из пустых мест. Например[None:None]
делает целую копию. Это полезно, когда вам нужно указать конец диапазона, используя переменную, и вам нужно включить последний элемент.del
делает запись нотации. В частности,del arr[:]
не сразу очевидно («arr [:] делает копию, поэтому удаляет эту копию ???» и т. Д.)Об этом рассказывается в руководстве по Python (прокрутите немного вниз, пока не дойдете до части о нарезке).
Рисунок ASCII также полезен для запоминания работы срезов:
источник
a[-4,-6,-1]
чтобы быть ,yP
но этоty
. То, что всегда работает, - это думать в символах или слотах и использовать индексирование как полуоткрытый интервал - справа, если положительный шаг, или слева, если отрицательный шаг.x[:0]
происходит при запуске с начала), поэтому вам придется использовать специальные массивы для небольших случаев. : /Перечисляя возможности, допускаемые грамматикой:
Конечно, если
(high-low)%stride != 0
, тогда конечная точка будет немного ниже, чемhigh-1
.Если
stride
отрицательный, порядок немного меняется, так как мы ведем обратный отсчет:Расширенные срезы (с запятыми и эллипсами) в основном используются только специальными структурами данных (например, NumPy); основные последовательности не поддерживают их.
источник
repr
__getitem__
является; ваш пример эквивалентенapple[slice(4, -4, -1)]
.Ответы выше не обсуждают назначение срезов. Чтобы понять назначение срезов, полезно добавить еще одну концепцию в искусство ASCII:
Одна эвристика, для среза от нуля до n, подумайте: «ноль - это начало, начните с начала и возьмите n элементов в списке».
Другая эвристика: «для любого среза замените начало на ноль, примените предыдущую эвристику, чтобы получить конец списка, а затем сосчитайте первое число обратно, чтобы отрезать элементы от начала».
Первое правило назначения срезов заключается в том, что, поскольку срезы возвращают список, для назначения срезов требуется список (или другие итерируемые):
Второе правило назначения слайсов, которое вы также можете видеть выше, заключается в том, что любая часть списка, возвращаемая при индексации слайсов, это та же самая часть, которая изменяется при назначении слайсов:
Третье правило назначения слайсов состоит в том, что назначенный список (повторяемый) не должен иметь одинаковую длину; Индексированный фрагмент просто вырезается и заменяется массой на все, что ему назначено:
Самая хитрая часть, к которой нужно привыкнуть, - это назначение пустым слайсам. Используя эвристику 1 и 2, легко разобраться с индексированием пустого фрагмента:
И затем, как только вы это увидели, назначение слайса пустому слайсу также имеет смысл:
Обратите внимание, что, поскольку мы не меняем второе число среза (4), вставленные элементы всегда располагаются прямо напротив «o», даже когда мы назначаем пустой срез. Таким образом, позиция для пустого назначения среза является логическим расширением позиций для непустых назначений среза.
Немного резервного копирования, что произойдет, если вы продолжите нашу процессию подсчета начала среза?
С нарезкой, как только вы закончите, вы закончите; это не начинает разрезать назад. В Python вы не получите отрицательных шагов, если вы явно не попросите их, используя отрицательное число.
Есть несколько странных последствий для правила «как только вы закончите, вы закончите»:
Фактически, по сравнению с индексированием, нарезка Python причудливо защищена от ошибок:
Иногда это может пригодиться, но также может привести к несколько странному поведению:
В зависимости от вашего приложения это может ... или не может ... быть тем, на что вы надеялись!
Ниже приведен текст моего оригинального ответа. Это было полезно для многих людей, поэтому я не хотел его удалять.
Это также может прояснить разницу между нарезкой и индексацией.
источник
Короче говоря, колоны (
:
) в индексном обозначении (subscriptable[subscriptarg]
) делает срез обозначение - у которого есть необязательные аргументы,start
,stop
,step
:Python Slice - это вычислительно быстрый способ для методического доступа к частям ваших данных. На мой взгляд, чтобы быть даже программистом среднего уровня на Python, это один из аспектов языка, с которым необходимо быть знакомым.
Важные определения
Для начала давайте определимся с несколькими терминами:
Как работает индексирование
Вы можете сделать любое из этих положительных или отрицательных чисел. Смысл положительных чисел является простым, но для отрицательных чисел, так же , как индексы в Python, считать в обратном порядке от конца для начала и остановок , а также за шагом , вы просто уменьшаете индекс. Этот пример взят из учебного пособия по документации , но я немного изменил его, чтобы указать, на какой элемент в последовательности ссылается каждый индекс:
Как работает нарезка
Чтобы использовать нотацию среза с последовательностью, которая ее поддерживает, необходимо включить хотя бы одно двоеточие в квадратные скобки, которые следуют за последовательностью (которые фактически реализуют
__getitem__
метод последовательности, согласно модели данных Python ).Запись среза работает следующим образом:
И помните, что есть настройки по умолчанию для запуска , остановки и шага , поэтому для доступа к значениям по умолчанию просто пропустите аргумент.
Запись среза, чтобы получить последние девять элементов из списка (или любой другой последовательности, которая поддерживает его, например, строку), будет выглядеть следующим образом:
Когда я вижу это, я читаю часть в скобках как «9-е от конца до конца». (На самом деле, я мысленно сокращаю это как "-9, на")
Объяснение:
Полная запись
и подставить значения по умолчанию ( на самом деле , когда
step
отрицательный,stop
по умолчанию имеет значение-len(my_list) - 1
, поэтомуNone
для остановки на самом деле просто означает , что он идет в зависимости от того , конечный шаг берет его к):Толстой кишки ,
:
является то , что говорит Python , что вы даете ему кусочек , а не регулярный индекс. Вот почему идиоматический способ создания мелкой копии списков в Python 2И очистка их с:
(Python 3 получает
list.copy
иlist.clear
метод.)Когда
step
отрицательно, значения по умолчанию дляstart
иstop
изменитьПо умолчанию, когда
step
аргумент пуст (илиNone
), он присваивается+1
.Но вы можете передать отрицательное целое число, и список (или большинство других стандартных разрезаемых элементов) будет разрезан от конца до начала.
Таким образом, отрицательный срез изменит значения по умолчанию для
start
иstop
!Подтверждая это в источнике
Мне нравится поощрять пользователей читать как источник, так и документацию. Исходный код ломтика объекты и эта логика здесь . Сначала мы определяем,
step
является ли оно отрицательным:Если это так, нижняя граница
-1
означает, что мы нарезаем весь путь вплоть до начала, а верхняя граница - это длина минус 1, что означает, что мы начинаем с конца. (Обратите внимание , что семантика этого-1
является отличается от А ,-1
что пользователи могут переходить индексы в Python , указывающие на последний элемент.)В противном случае
step
положительно, и нижняя граница будет равна нулю, а верхняя граница (до которой мы идем, но не включая) длины нарезанного списка.Затем нам может потребоваться применить значения по умолчанию для
start
иstop
- значение по умолчанию для forstart
рассчитывается как верхняя граница, когдаstep
она отрицательна:и
stop
нижняя граница:Дайте своим кусочкам описательное имя!
Может оказаться полезным отделить формирование среза от передачи его
list.__getitem__
методу (это то, что делают квадратные скобки ). Даже если вы не новичок в этом, он делает ваш код более читабельным, чтобы другие, которым, возможно, придется читать ваш код, могли более легко понять, что вы делаете.Однако вы не можете просто присвоить переменной целые числа, разделенные двоеточиями. Вам нужно использовать объект среза:
Второй аргумент,
None
обязателен, так что первый аргумент интерпретируется какstart
аргумент, иначе это будетstop
аргумент .Затем вы можете передать объект слайса в вашу последовательность:
Интересно, что диапазоны также берут кусочки:
Вопросы памяти:
Так как фрагменты списков Python создают новые объекты в памяти, следует помнить о другой важной функции
itertools.islice
. Обычно вам нужно перебирать фрагмент, а не просто создавать его статически в памяти.islice
идеально подходит для этого. Протест, он не поддерживает отрицательные аргументыstart
,stop
илиstep
, так что если это вопрос , вам могут понадобиться для расчета индексов или реверсом итерации заранее.и сейчас:
Тот факт, что срезы списков делают копию, является особенностью самих списков. Если вы нарезаете сложные объекты, такие как Pandas DataFrame, он может вернуть представление оригинала, а не его копию.
источник
И пара вещей, которые не были сразу очевидны для меня, когда я впервые увидел синтаксис среза:
Простой способ изменить последовательность!
И если вы хотите, по какой-то причине, каждый второй элемент в обратной последовательности:
источник
В Python 2.7
Нарезка в Python
Понимание назначения индекса очень важно.
Когда вы говорите [a: b: c], вы говорите, в зависимости от знака c (вперед или назад), начинайте с a и заканчивайте на b (исключая элемент с индексом b). Используйте вышеприведенное правило индексации и помните, что вы найдете только элементы в этом диапазоне:
Но этот диапазон продолжается в обоих направлениях бесконечно:
Например:
Если ваш выбор a, b и c позволяет перекрываться с указанным выше диапазоном, когда вы проходите, используя правила для a, b, c выше, вы либо получите список с элементами (затронутый во время обхода), либо вы получите пустой список.
И последнее: если a и b равны, вы также получаете пустой список:
источник
a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; a[:-2:-2]
который приводит к[9]
Нашел эту великолепную таблицу по адресу http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
источник
После небольшого использования я понимаю, что самое простое описание - это то же самое, что и аргументы в
for
цикле ...Любые из них являются необязательными:
Тогда для отрицательного индексирования нужно, чтобы вы добавили длину строки к отрицательным индексам, чтобы понять это.
В любом случае это работает для меня ...
источник
Мне легче вспомнить, как это работает, и затем я могу определить любую конкретную комбинацию старт / стоп / шаг.
Поучительно
range()
сначала понять :Начните с
start
, увеличивайтеstep
, не достигайтеstop
. Очень просто.О негативном шаге следует помнить, что
stop
это всегда исключаемый конец, будь то выше или ниже. Если вы хотите, чтобы один и тот же срез находился в обратном порядке, гораздо проще сделать инверсию по отдельности: например,'abcde'[1:-2][::-1]
срезать один символ слева, два справа, а затем поменять местами. (Смотри такжеreversed()
.)Секвенция секвенции такая же, за исключением того, что сначала она нормализует отрицательные индексы и никогда не может выходить за пределы последовательности:
TODO : В приведенном ниже коде была ошибка «никогда не выходить за пределы последовательности», когда abs (step)> 1; Я думаю, что я исправил это, чтобы быть правильным, но это трудно понять.
Не беспокойтесь о
is None
деталях - просто помните, что опусканиеstart
и / илиstop
всегда делает правильные вещи, чтобы дать вам всю последовательность.Нормализация отрицательных индексов сначала позволяет независимо начинать и / или останавливать отсчет с конца:
'abcde'[1:-2] == 'abcde'[1:3] == 'bc'
несмотря наrange(1,-2) == []
. Нормализация иногда рассматривается как «по модулю длины», но обратите внимание, что она добавляет длину только один раз: например,'abcde'[-53:42]
это просто целая строка.источник
this_is_how_slicing_works
не то же самое, что срез питона. EG[0, 1, 2][-5:3:3]
получит [0] в python, ноlist(this_is_how_slicing_works([0, 1, 2], -5, 3, 3))
получит [1].range(4)[-200:200:3] == [0, 3]
ноlist(this_is_how_slicing_works([0, 1, 2, 3], -200, 200, 3)) == [2]
. Мояif 0 <= i < len(seq):
попытка реализовать «никогда не выходить за пределы последовательности» просто, но не подходит для шага> 1. Я перепишу это позже сегодня (с тестами).Я сам использую метод «указатель указывает между элементами», но один способ описать его, который иногда помогает другим получить его, заключается в следующем:
X - это индекс первого элемента, который вы хотите.
Y - индекс первого элемента, который вам не нужен.
источник
Я надеюсь, что это поможет вам смоделировать список в Python.
Ссылка: http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
источник
Обозначение среза Python:
start
иend
, отрицательные значения интерпретируются как относящиеся к концу последовательности.end
обозначения позиции после последнего включаемого элемента.[+0:-0:1]
.start
иend
Обозначения распространяются на (NumPy) матриц и многомерных массивов. Например, чтобы разрезать целые столбцы, вы можете использовать:
Срезы содержат ссылки, а не копии элементов массива. Если вы хотите сделать отдельную копию массива, вы можете использовать
deepcopy()
.источник
Вы также можете использовать назначение слайса, чтобы удалить один или несколько элементов из списка:
источник
Это просто для дополнительной информации ... Рассмотрим список ниже
Несколько других приемов для изменения списка:
источник
Вот как я преподаю ломтики новичкам:
Понимание разницы между индексированием и нарезкой:
У Wiki Python есть эта удивительная картина, которая четко различает индексацию и нарезку.
Это список из шести элементов. Чтобы лучше понять нарезку, рассмотрите этот список как набор из шести блоков, помещенных вместе. В каждой коробке есть алфавит.
Индексирование похоже на работу с содержимым коробки. Вы можете проверить содержимое любой коробки. Но вы не можете проверить содержимое нескольких ящиков одновременно. Вы даже можете заменить содержимое коробки. Но вы не можете поместить два шара в одну коробку или заменить два шара одновременно.
Нарезка подобна работе с самими коробками. Вы можете взять первую коробку и поставить ее на другой стол. Чтобы поднять коробку, все, что вам нужно знать, это положение начала и конца коробки.
Вы можете даже выбрать первые три блока или последние два блока или все блоки от 1 до 4. Таким образом, вы можете выбрать любой набор блоков, если вы знаете начало и конец. Эти позиции называются начальной и конечной позициями.
Интересно то, что вы можете заменить несколько коробок одновременно. Также вы можете разместить несколько ящиков где угодно.
Нарезка с шагом:
До сих пор вы постоянно выбирали коробки. Но иногда нужно подобрать дискретно. Например, вы можете подобрать каждую вторую коробку. Вы можете даже забрать каждую третью коробку с конца. Это значение называется размером шага. Это представляет разрыв между вашими последующими пикапами. Размер шага должен быть положительным, если вы выбираете поля от начала до конца и наоборот.
Как Python вычисляет недостающие параметры:
При нарезке, если вы пропустите какой-либо параметр, Python пытается выяснить это автоматически.
Если вы проверите исходный код CPython , вы найдете функцию PySlice_GetIndicesEx (), которая вычисляет индексы для среза для любых заданных параметров. Вот логический эквивалент кода в Python.
Эта функция принимает объект Python и необязательные параметры для нарезки и возвращает начало, конец, шаг и длину среза для запрошенного среза.
Это интеллект, который присутствует за кусочками. Поскольку в Python есть встроенная функция, называемая slice, вы можете передать некоторые параметры и проверить, насколько разумно он рассчитывает отсутствующие параметры.
Примечание. Этот пост изначально был написан в моем блоге «Интеллект за кусочками Python» .
источник
Как правило, написание кода с большим количеством жестко закодированных значений индекса приводит к беспорядку читаемости и обслуживания. Например, если вы вернетесь к коду год спустя, вы посмотрите на него и удивитесь, о чем вы думали, когда писали его. Показанное решение - просто способ более четко определить, что на самом деле делает ваш код. Как правило, встроенный slice () создает объект слайса, который можно использовать везде, где разрешен слайс. Например:
Если у вас есть экземпляр слайса s, вы можете получить больше информации о нем, посмотрев на его атрибуты s.start, s.stop и s.step соответственно. Например:
источник
1. Обозначение среза
Чтобы было проще, помните, что ломтик имеет только одну форму:
и вот как это работает:
s
: объект, который можно нарезатьstart
: первый индекс для начала итерацииend
: последний индекс, ОБРАТИТЕ ВНИМАНИЕ, чтоend
индекс не будет включен в результирующий фрагментstep
: выбрать элемент каждогоstep
индексаДругой импорт вещь: все
start
,end
,step
может быть опущена! И если они опущены, будет использовано их значение по умолчанию:0
,len(s)
,1
соответственно.Итак, возможные варианты:
ПРИМЕЧАНИЕ. Если
start >= end
(учитывая только когдаstep>0
), Python вернет пустой фрагмент[]
.2. Подводные камни
Вышеприведенная часть объясняет основные особенности того, как работает слайс, и он будет работать в большинстве случаев. Однако могут быть подводные камни, на которые следует обратить внимание, и эта часть объясняет их.
Отрицательные показатели
Самое первое, что смущает изучающих Python, это то, что индекс может быть отрицательным! Не паникуйте: отрицательный индекс означает обратный отсчет.
Например:
Отрицательный шаг
Делать вещи более запутанными - это
step
тоже может быть негативно!Отрицательный шаг означает итерацию массива в обратном направлении: от конца к началу, с включенным индексом конца и индексом начала, исключенным из результата.
Примечание : если шаг отрицательный, значение по умолчанию
start
являетсяlen(s)
(покаend
не составит0
, так какs[::-1]
содержитs[0]
). Например:Ошибка вне диапазона?
Будьте удивлены: слайс не вызывает ошибку IndexError, когда индекс выходит за пределы диапазона!
Если индекс находится вне диапазона, Python будет пытаться все возможное , чтобы установить индекс
0
или вlen(s)
зависимости от ситуации. Например:3. Примеры
Давайте закончим этот ответ примерами, объясняя все, что мы обсуждали:
источник
В предыдущих ответах не обсуждается разделение многомерных массивов, что возможно при использовании известного пакета NumPy :
Нарезка также может быть применена к многомерным массивам.
«
:2
» Перед запятой действует в первом измерении, а «0:3:2
» после запятой действует во втором измерении.источник
list
но только наarray
NumpyВы можете запустить этот скрипт и поэкспериментировать с ним, ниже приведены некоторые примеры, которые я получил из скрипта.
При использовании отрицательного шага обратите внимание, что ответ смещен вправо на 1.
источник
Мой мозг, кажется, рад принять, что
lst[start:end]
содержитstart
-й пункт. Я мог бы даже сказать, что это «естественное предположение».Но иногда возникает сомнение, и мой мозг просит заверить, что он не содержит
end
-го элемента.В эти моменты я полагаюсь на эту простую теорему:
Это симпатичное свойство говорит мне, что
lst[start:end]
не содержитend
-й элемент, потому что он находится вlst[end:]
.Обратите внимание, что эта теорема верна для любого
n
вообще. Например, вы можете проверить, чтовозвращается
True
.источник
На мой взгляд, вы лучше поймете и запомните нотацию Python для разрезания строк, если посмотрите на нее следующим образом (читайте дальше).
Давайте работать со следующей строкой ...
Для тех, кто не знает, вы можете создать любую подстроку,
azString
используя обозначениеazString[x:y]
Исходя из других языков программирования, это когда здравый смысл нарушается. Что такое х и у?
Мне пришлось сесть и запустить несколько сценариев в своем поиске техники запоминания, которая поможет мне вспомнить, что такое x и y, и поможет мне правильно нарезать строки с первой попытки.
Мой вывод заключается в том, что x и y следует рассматривать как граничные индексы, которые окружают строки, которые мы хотим добавить. Таким образом, мы должны видеть выражение как
azString[index1, index2]
или даже более ясным, какazString[index_of_first_character, index_after_the_last_character]
.Вот пример визуализации этого ...
Поэтому все, что вам нужно сделать, это установить index1 и index2 в значения, которые будут окружать желаемую подстроку. Например, чтобы получить подстроку "cdefgh", вы можете использовать
azString[2:8]
, потому что индекс слева от «c» равен 2, а индекс справа от «h» равен 8.Помните, что мы устанавливаем границы. И эти границы - это позиции, где вы можете поместить несколько скобок, которые будут обернуты вокруг подстроки, как это ...
ab [ cdefgh ] ij
Этот трюк работает постоянно и его легко запомнить.
источник
Большинство предыдущих ответов проясняют вопросы о записи срезов.
Расширенный синтаксис индексации, используемый для нарезки
aList[start:stop:step]
, и основные примеры::
Больше примеров нарезки: 15 расширенных ломтиков
источник
В Python наиболее простой формой для нарезки является следующее:
где
l
- некоторая коллекция,start
это инклюзивный индекс иend
эксклюзивный индекс.При нарезке с начала вы можете опустить нулевой индекс, а при срезании до конца вы можете опустить конечный индекс, так как он избыточен, поэтому не будьте многословны:
Отрицательные целые числа полезны при выполнении смещений относительно конца коллекции:
Можно предоставить индексы, которые выходят за границы при нарезке, такие как:
Имейте в виду, что результатом нарезки коллекции является совершенно новая коллекция. Кроме того, при использовании обозначений срезов в назначениях длина назначений срезов не обязательно должна быть одинаковой. Значения до и после назначенного среза будут сохранены, а коллекция будет уменьшаться или увеличиваться, чтобы содержать новые значения:
Если вы пропустите начальный и конечный индексы, вы создадите копию коллекции:
Если начальный и конечный индексы опущены при выполнении операции присваивания, весь контент коллекции будет заменен копией того, на что есть ссылки:
Помимо базовой нарезки, также можно применять следующие обозначения:
где
l
- коллекция,start
инклюзивный индекс,end
эксклюзивный индекс иstep
шаг, который можно использовать для ввода каждого n-го элементаl
.Использование
step
предоставляет полезную хитрость для обращения коллекции в Python:Также можно использовать отрицательные целые числа для
step
следующего примера:Однако использование отрицательного значения для
step
может стать очень запутанным. Кроме того, для того , чтобы быть вещим , следует избегать использованияstart
,end
иstep
в одном срезе. В случае, если это требуется, подумайте о том, чтобы сделать это в двух заданиях (одно для нарезки, а другое для продвижения).источник
Я хочу добавить один Hello, World! Пример, объясняющий основы ломтиков для самых начинающих. Это мне очень помогло.
Давайте составим список из шести значений
['P', 'Y', 'T', 'H', 'O', 'N']
:Теперь простейшими срезами этого списка являются его подсписки. Обозначение
[<index>:<index>]
и ключ, чтобы прочитать это так:Теперь, если вы сделаете часть
[2:5]
списка выше, это произойдет:Вы сделали разрез перед элементом с индексом
2
и еще один разрез перед элементом с индексом5
. Таким образом, результатом будет срез между этими двумя разрезами, список['T', 'H', 'O']
.источник
Я лично думаю об этом как о
for
петле:Также обратите внимание, что отрицательные значения для
start
иend
относятся к концу списка и вычисляются в приведенном выше примере с помощьюgiven_index + a.shape[0]
.источник
Ниже приведен пример индекса строки:
Пример нарезки: [начало: конец: шаг]
Ниже приведен пример использования:
источник
Если вы чувствуете, что отрицательные индексы в разрезании сбивают с толку, вот очень простой способ подумать об этом: просто замените отрицательный индекс на
len - index
. Так, например, заменить -3 наlen(list) - 3
.Лучший способ проиллюстрировать, что секционирование выполняет внутренне, - просто показать это в коде, который реализует эту операцию:
источник
Основной метод нарезки - определить начальную точку, точку остановки и размер шага - также известный как шаг.
Во-первых, мы создадим список значений для использования в нашей нарезке.
Создайте два списка для нарезки. Первый представляет собой числовой список от 1 до 9 (список А). Второй также является числовым списком от 0 до 9 (список B):
Индексируйте число 3 от A и число 6 от B.
Базовая нарезка
Расширенный синтаксис индексации, используемый для нарезки, - это aList [start: stop: step]. Аргумент start и шаг по умолчанию равны none - единственным обязательным аргументом является stop. Вы заметили, что это похоже на то, как диапазон использовался для определения списков A и B? Это связано с тем, что объект слайса представляет собой набор индексов, заданных диапазоном (начало, остановка, шаг). Документация по Python 3.4.
Как видите, определение только stop возвращает один элемент. Поскольку в начале по умолчанию ничего нет, это приводит к извлечению только одного элемента.
Важно отметить, что первым элементом является индекс 0, а не индекс 1. Именно поэтому мы используем 2 списка для этого упражнения. Элементы списка A нумеруются в соответствии с порядковым положением (первый элемент равен 1, второй элемент равен 2 и т. Д.), А элементы списка B представляют собой числа, которые будут использоваться для их индексации ([0] для первого элемента 0, так далее.).
С расширенным синтаксисом индексации мы получаем диапазон значений. Например, все значения извлекаются с помощью двоеточия.
Чтобы получить подмножество элементов, необходимо определить начальную и конечную позиции.
Учитывая шаблон aList [start: stop], получить первые два элемента из списка А.
источник
Я не думаю, что учебная схема Python (цитируемая в различных других ответах) хороша, так как это предложение работает для положительного шага, но не для отрицательного шага.
Это диаграмма:
Из диаграммы, я ожидаю ,
a[-4,-6,-1]
чтобы быть ,yP
но этоty
.То, что всегда работает, - это думать в символах или слотах и использовать индексирование как полуоткрытый интервал - справа, если положительный шаг, или слева, если отрицательный шаг
Таким образом, я могу думать ,
a[-4:-6:-1]
какa(-6,-4]
в интервальной терминологии.источник