Что на самом деле делает синтаксис расширенного среза для отрицательных шагов? [дубликат]
этот вопрос уже есть ответ здесь:
- понимание обозначения среза 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 предметы.