Уточнение шага нарезки строк Python

#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] затем принимает целую строку, поскольку вы не назначили a start , поэтому он будет считать, что это 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)]
  

  1. Когда none указано

срез [::] — это то, что эквивалентно:

 [0:len(x):1]
  

Перестаньте быть len(x) так, как мы начинаем, индекс начинается с 0 .


  1. Когда шаг отрицательный

Допустим, срез — это: [::-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"