Разъяснение строки нарезки строки Python - PullRequest
19 голосов
/ 14 октября 2011

Так что я действительно не понимаю сделку с параметром шага при нарезке.
Например, "123456"[::-2] производит "642", но почему "123456"[1::-2] производит "2", а "123456"[2::-2] производит "31"?

Ответы [ 4 ]

24 голосов
/ 14 октября 2011

Самый простой способ объяснить это, вероятно, обратиться к вашим примерам:

"123456"[::-2]
# This takes the whole string ([::])
# Then it works backward (-)
# and it does every other character (2)

"123456"[1::-2]
# This is also working backward (-)
# every other character (2)
# but starting at position 1, which is the number 2.

"123456"[2::-2]
# Again, working backward (-)
# Every other character (2)
# begin at position 2, so you end up with positions 2, and 0, or '31'

Синтаксис нарезки [<start>:<end>:step]. Если <start> опущен и шаг отрицательный, то он начинается с конца строки.

5 голосов
/ 14 октября 2011

Это потому, что синтаксис string[start:end:step]

"123456"[::-2]

Создает "642", потому что он начинается с последнего символа.Это потому, что вы не указали, с какой позиции будет выполняться срез.Таким образом, он будет возвращаться на 2 символа из последнего, пока не достигнет первого.

"123456"[1::-2]

Создает «2», потому что вы сказали Python начинать со 2-го символа (индекс 1 из строки)и вы сказали Python вернуться на 2 шага от этой позиции.Что в этом случае, Python, очевидно, вернул бы просто «2».Это потому, что когда Python попытался вернуться назад на 2 шага, он уже ударил первый символ в строке всего одним шагом.

"123456"[2::-2]

Вы должны быть в состоянии выяснить это сейчас.Но я все равно объясню.Итак, вы сказали Python начать с третьего символа (или индекса 2), а затем вернуться назад на 2 шага, пока он не достигнет первого символа.Таким образом, он начнется с «3», а затем вернется на 2 шага, и случайно будет достигнут первый символ - который, как оказалось, «1».Таким образом, Python даст вам «31»

5 голосов
/ 14 октября 2011

Помните, что индексы начинаются с нуля.Имея это в виду, может быть понятнее, если вы измените свою строку на '012345':

In [1]: '012345'[1::-2]
Out[1]: '1'

In [2]: '012345'[2::-2]
Out[2]: '20'

In [3]: '012345'[5::-2]
Out[3]: '531'

Как видите, срез начинается с правильного индекса и делает правильный (отрицательный) шагна каждом шаге, пока не достигнет начала строки.

0 голосов
/ 14 октября 2011

Когда вы используете шаг, он имеет в основном два параметра. (индекс для начала шага, интервал шага)

"1234"[index::interval]

Просто помните, что строки индексируются, начиная с нуля, поэтому

"123456"[2::-2]

говорит, что начните с индекса 2 или "3" и захватите каждый в пределах интервала.

"31"
...