#python #stride
#python #шаг
Вопрос:
Так что я действительно не понимаю, что делать с параметром stride при нарезке.
Например, "123456"[::-2]
производит "642"
, но почему "123456"[1::-2]
производит "2"
и "123456"[2::-2]
производит "31"
?
Ответ №1:
Самый простой способ объяснить, вероятно, обратиться к вашим примерам:
"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>
значение опущено и шаг отрицательный, то он начинается с конца строки.
Комментарии:
1. Это очень хороший ответ, разъяснение для OP.
[::-2]
затем принимает целую строку, поскольку вы не назначили astart
, поэтому он будет считать, что это0
очень похожеrange(number)
. Кроме того, попробуйте освоить игру с индексами, как только вы это сделаете, это очень мощная функция. Например, это классная однолинейная проверка палиндромов :string == string[::-1]
. Удачи!2. Для «123456» [::-2] почему он начинается с 6, а не с 1? Я думал, что, оставив переменные в [::] по умолчанию, это происходит с самого начала (т. е. 1) до конца, так что, конечно, это должно быть 153 …?
3. @DanielMak — Да? Он не начинается с индекса 0, а затем оборачивается обратно. Вы никак не получите 153.
4. Да, это то, чего я не понимаю… Я имею в виду, что при нормальных обстоятельствах (например, не возвращаясь назад), оставляя start и finish, мы начинаем с нулевого значения. Теперь единственное, что мы изменили, это указав, что оно должно идти в обратном направлении: мы все еще не изменили параметры stsrt и finish , так почему же теперь он начинается с 6 вместо 1? Извините, мне всего неделя в мире программирования, но я действительно благодарен вам за помощь!
5. @DanielMak — Именно так определяется язык. Если вы опустили начало, а шаг отрицательный, то список ввода (и результат) меняются на противоположные. Здесь можно прочитать еще кое-что: pythoncentral.io/how-to-slice-listsarrays-and-tuples-in-python . Об этом больше нечего сказать — это просто то, как это работает .
Ответ №2:
Помните, что индексы начинаются с нуля. Имея это в виду, может быть понятнее, если вы измените свою строку на '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'
Как вы можете видеть, фрагмент начинается с правильного индекса и делает правильный (отрицательный) шаг на каждом шаге, пока не достигнет начала строки.
Ответ №3:
Это потому, что синтаксис 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»
Ответ №4:
Когда вы используете stride, он имеет в основном два параметра. (индекс для начала шага, интервал шага)
"1234"[index::interval]
Просто помните, что жала индексируются, начиная с нуля, поэтому
"123456"[2::-2]
говорит, что начинается с индекса 2 или «3» и захватывает каждый из них в пределах интервала.
"31"
Ответ №5:
давайте разберемся с разделением в синтаксисе python:
string[starting index : ending index : step]
и ваш первый пример:
"123456"[::-2]
[::]
без указания какого-либо начального индекса он займет всю строку, 123456
[::-2]
значение -2 означает, что отсчет начинается с конца строки каждые 2 шага.
Итак, вы получите 642.
Ответ №6:
Я понимаю это, спрашивая себя, для чего используются значения по умолчанию start
, stop
и step
когда они не указаны. Допустим, мы хотим нарезать строку x="123456"
. У нас есть
x[start:stop:step]
эквивалентно
x[slice(start,stop,step)]
- Когда
none
указано
срез [::]
— это то, что эквивалентно:
[0:len(x):1]
Перестаньте быть len(x)
так, как мы начинаем, индекс начинается с 0
.
- Когда шаг отрицательный
Допустим, срез — это: [::-1]
эквивалентно:
[-1: -(len(x) 1) : -1]
=[-1: ~len(x): -1] #~ being the bitwise complement
Давайте посмотрим, сможем ли мы ответить на ваши вопросы на основе значений по умолчанию.
Случай a
>>> "123456"[::-2]
"642"
Скажем
>>> x = "123456"
>>> x[::-2]
= [-1: -( len(x) 1) :-2]
= x[-1:-7:-2]
= x[-1] x[-1 -2] x[-1 -2 -2]
= x[-1] x[-3] x[-5]
= "642"
Случай b
>>> "123456"[1::-2]
"2"
Вот шаги, которые нужно воспроизвести, чтобы получить результат:
>>> x[1::-2]
= x[1: -(len(x) 1): -2]
= x[1:-7:-2]
= x[1] x(two indices to the left of x[1])
= x[1] "" = x[1]
= "2"
Случай 3
Вот пример 3:
>>> "123456"[2::-2]
"31"
Шаги для воспроизведения:
>>> x[2::-2]
= x[2: -(len(x) 1): -2]
= x[2:-7:-2]
= x[2] x[2-2]
= x[2] x[0]
= "31"