Что на самом деле делает синтаксис расширенного среза для отрицательных шагов? [дубликат]
этот вопрос уже есть ответ здесь:
- понимание обозначения среза Python 30 ответов
синтаксис расширенного среза в python был объяснен мне как"a[n:m:k] returns every kth element from n to m
".
это дает мне хорошее представление о том, чего ожидать, когда k положительно. Но я теряюсь в том, как интерпретировать a[n:m:k]
для отрицательный к. Я знаю это a[::-1]
переворачивает а, и что a[::-k]
принимает когда-либо K-й элемент перевернутого a.
но как это обобщение определений к положительным? Я хотел бы знать, как a[n:m:k]
фактически определен, так что (например) я могу понять, почему:
"abcd"[-1:0:-1] = "dcb"
Is a[n:m:-k]
реверсирование последовательности a, затем взятие элементов с исходными индексами, начиная с n и заканчивая одним перед m или чем-то еще? Я так не думаю, потому что это не так. установите другие значения n и m, которые я пробовал. Но я не могу понять, как это на самом деле определено, и поиск никуда меня не привел.
2 ответов
[-1:0:-1]
означает: начните с индекса len(string)-1
и переехать в 0
(не входит в комплект) и сделать шаг -1
(реверс).
таким образом, извлекаются следующие индексы:
le-1, le-1-1, le-1-1-1 .... 1 # le is len(string)
пример:
In [24]: strs = 'foobar'
In [25]: le = len(strs)
In [26]: strs[-1:0:-1] # the first -1 is equivalent to len(strs)-1
Out[26]: 'raboo'
In [27]: strs[le-1:0:-1]
Out[27]: 'raboo'
документация Python (вот технический; объяснение range()
немного легче понять) является более правильным, чем упрощенное объяснение "каждый K-й элемент". Параметры нарезки метко называются
slice[start:stop:step]
таким образом, срез начинается в месте, определенном start
, останавливается перед расположении stop
достигается и перемещается из одной позиции в другую по step
предметы.