Пожалуйста, объясните изменение последовательности Python - PullRequest
0 голосов
/ 09 января 2012

Не знаю, где я поднял это, но оно застряло, и я все время им пользуюсь.

Может кто-нибудь объяснить, как работает этот переворот строки?Я использую его для проверки палиндромных строк без предварительного преобразования в изменяемый тип.

>>> word = "magic"
>>> magic = word[::-1]
>>> magic
'cigam' 

Я бы высказал свое предположение, но я не хочу вдаваться в какие-либо предвзятые мнения о внутренностях, стоящих за этим.полезный трюк.

Ответы [ 4 ]

7 голосов
/ 09 января 2012

Запись среза выглядит следующим образом:

my_list[start:end:step]

Итак, когда вы делаете [::-1], это означает:

  • start: ничего (по умолчанию)
  • end: ничего (по умолчанию)
  • step: -1 (по убыванию)

Итак, вы переходите от конца списка (по умолчанию) к первому элементу (по умолчанию), уменьшая индекс на единицу (-1).

Итак, как говорилось во многих ответах, нет ни сортировки, ни замены на месте, просто запись среза.

4 голосов
/ 09 января 2012

Вы можете посмотреть здесь - это расширенный срез .

3 голосов
2 голосов
/ 09 января 2012

Этот «трюк» является просто частным случаем применения операции среза к последовательности. Вы можете использовать его для создания обратной копии списка или кортежа. Еще один «трюк» из того же семейства: [:] часто используется для создания (мелкой) копии списка.

«Что нового в Python 2.3» - неожиданная точка входа в лабиринт. Давайте начнем с более очевидного (?) Места, текущей документации 2.X для объектов последовательности .

В таблице операций последовательности вы увидите строку с Operation = s [i: j: k], Result = "фрагмент s из i в j с шагом k" и Notes = "(3) (5)».

Примечание 3 говорит: «Если i или j отрицательны, индекс относится к концу строки: подставляется len (s) + i или len (s) + j. Но обратите внимание, что -0 по-прежнему равно 0. «

В примечании 5 говорится: «Срез s от i до j с шагом k определяется как последовательность элементов с индексом x = i + n * k, такой что 0 <= n <(ji) / k. Другими словами , индексы i, i + k, i + 2 * k, i + 3 * k и т. д., остановка при достижении j (но не включая j). Если i или j больше len (s), используйте len (s). Если i или j опущены или отсутствуют, они становятся «конечными» значениями (конец которых зависит от знака k). Обратите внимание, что k не может быть равным нулю. Если k равно None, оно рассматривается как 1. </p>

У нас есть k == -1, поэтому используются следующие индексы: i, i-1, i-2, i-3 и т. Д., Останавливаясь при достижении j (но никогда не включая j). Чтобы получить наблюдаемый эффект, «конечное» значение, используемое для i, должно быть len(s)-1, а «конечное» значение, используемое для j, должно быть -1. Таким образом, используются индексы last, last-1, ..., 2, 1.

Еще одна точка входа - рассмотреть, как мы можем получить такой результат для любой последовательности, если [::-1] не существует в языке:

def reverse_traversal_of_sequence(s):
    for x in range(len(s) - 1, -1, -1):
        do_something_with(s[x])
...