Какво всъщност прави синтаксисът на разширения срез за отрицателните стъпки?

Синтаксисът на разширения срез в python ми беше обяснен като "a[n:m:k] returns every kth element from n to m".

Това ми дава добра представа какво да очаквам, когато k е положително. Но не знам как да тълкувам a[n:m:k] за отрицателно k. Знам, че a[::-1] обръща a и че a[::-k] взема всеки k-ти елемент от обърнатото a.

Но как това е обобщение на определението за k положително? Бих искал да знам как всъщност се дефинира a[n:m:k], така че (например) да мога да разбера защо:

"abcd"[-1:0:-1] = "dcb"

Дали a[n:m:-k] обръща последователността a, след което взема елементите с оригинални индекси, започващи от n и завършващи един преди m или нещо подобно? Не мисля така, защото този модел не пасва на други стойности на n и m, които съм пробвал. Но не мога да разбера как всъщност се дефинира това и търсенето не ме доведе доникъде.


person Alex Becker    schedule 25.01.2013    source източник
comment
Свързан въпрос: stackoverflow.com/questions/12521798/   -  person user2314737    schedule 28.08.2016
comment
Този въпрос не е дубликат на нотацията за срез на Explain Python. Това изисква подробности относно отрицателната стъпка, докато последната е обща за нарязване   -  person gawkface    schedule 18.05.2017


Отговори (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'
person Ashwini Chaudhary    schedule 25.01.2013
comment
Благодаря, това обяснение ми стана много ясно. Липсваше ми рекурсивното стъпване и фактът, че крайната точка не е включваща. - person Alex Becker; 25.01.2013
comment
Да, точката, че стъпката създава последователност, прави това обяснение разбираемо, т.е. str[-2:-6:-1] ще доведе до избрани следните индекси -2, -2-1=-3, -2-1-1= -4, чак до -6 (без). Извличане с низ: ››› print (07654321[-2:-6:-1]) 2345 - person gawkface; 18.05.2017
comment
Каква стойност бихте използвали изрично за i и j в strs[i:j:-1], за да обърнете низ като strs[::-1]? - person Asad Moosvi; 15.08.2017
comment
@AsadMoosvi i може да бъде None или len(strs), а j може да бъде None. - person Ashwini Chaudhary; 15.08.2017
comment
много мило благодаря. Ще strs[-2:-6] = 'ooba' и strs[-2:-6:-1] = 'aboo' - person trustory; 15.02.2019

Документацията на Python (ето техническата; обяснението за range() е малко по-лесно за разбиране) е по-правилно от опростеното "всеки k-ти елемент " обяснение. Параметрите на нарязване са наименувани подходящо

slice[start:stop:step]

така че срезът започва от местоположението, определено от start, спира преди да бъде достигнато местоположението stop и се придвижва от една позиция към следващата с step елемента.

person Tim Pietzcker    schedule 25.01.2013