Разъяснение шага нарезки строк Python

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


person user995788    schedule 14.10.2011    source источник


Ответы (5)


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

"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> опущено и шаг отрицательный, то он начинается с конца строки.

person g.d.d.c    schedule 14.10.2011
comment
Это очень хороший ответ, разъяснение для ОП. [::-2] берет всю строку, так как вы не назначили start, поэтому предполагается, что это 0 очень похоже на range(number). Кроме того, попробуйте научиться играть с индексами, как только вы это сделаете, это очень мощная функция. Например, вот классная однострочная программа проверки палиндрома: string == string[::-1]. Удачи! - person Trufa; 14.10.2011
comment
Почему 123456[::-2] начинается с 6, а не с 1? Я думал, что, опустив переменные в [::], по умолчанию они идут с самого начала (т.е. 1) до конца, так что наверняка должно быть 153...? - person Daniel Mak; 08.09.2018
comment
@DanielMak - а? Он не начинается с индекса 0, а затем возвращается обратно. Вы никак не можете получить 153. - person g.d.d.c; 09.09.2018
comment
Да, это то, чего я не понимаю... Я имею в виду, что при нормальных обстоятельствах (например, не возвращаясь назад), опуская начало и конец, мы начинаем с нулевого символа. Теперь единственное, что мы изменили, — это указать, чтобы он шел назад: мы по-прежнему не меняли параметры stsrt и finish, так почему же теперь он начинается с 6 вместо 1? Извините, мне всего неделя в мире кодирования, но я очень благодарен за вашу помощь! - person Daniel Mak; 09.09.2018
comment
@DanielMak - именно так указывается язык. Если вы опускаете начало, а шаг отрицательный, то входной список (и результат) меняются местами. Здесь есть еще кое-что для чтения: pythoncentral.io/ как нарезать списки массивов и кортежей в Python. Об этом больше нечего сказать — просто как это работает. - person g.d.d.c; 09.09.2018

Это потому, что синтаксис 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»

person Kemal Fadillah    schedule 14.10.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'

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

person NPE    schedule 14.10.2011

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

"1234"[index::interval]

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

"123456"[2::-2]

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

"31"
person stehlikio    schedule 14.10.2011

давайте разберемся с нарезкой в ​​синтаксисе python:

string[starting index : ending index : step]

и ваш первый пример:

123456[::-2]

[::], без указания начального индекса, возьмет всю строку, 123456

[::-2], значение -2 означает, что счет начинается с конца строки через каждые 2 шага.

Таким образом, вы получите 642.

person Yong En    schedule 01.10.2019