2009-04-19 4 views
32

Я искал способ напечатать строку назад, и после быстрого поиска на Google, я нашел этот метод:изменить строку в Python

Пусть «а» является строковой переменной. Это вернет строку «a» назад:

a[::-1] 

Может ли кто-нибудь объяснить, как это работает?

+0

** Пожалуйста seealso **: Http: // StackOverflow .com/a/33457266/42223, который рассматривает эту функцию python, что некоторые могут найти «причудливый». – dreftymac

ответ

68

Конечно, [::] является extended slice оператором. Это позволяет В основном, он работает, указывая, какие элементы вы хотите как [begin: end: step], и он работает для всех последовательностей. Два аккуратных предмета:

  • Вы можете пропустить один или несколько элементов, и это делает «правильные вещи»
  • Отрицательных чисел для начала, конца и шаг имеет значение

Для начала и конца, если вы даете отрицательное число , это означает подсчет с конца последовательности.Например, если у меня есть список:

l = [1,2,3] 

Тогда l[-1] 3, l[-2] является 2, и l[-3] равен 1.

Для step аргумента отрицательное число означает, что работать обратную через последовательность. Таким образом, для списка ::

l = [1,2,3,4,5,6,7,8,9,10] 

Вы можете написать l[::-1], которые в основном означает использовать размер шага -1 при чтении списка. Python будет «делать правильные вещи» при заполнении старта и остановки, поэтому он повторяет список в обратном порядке и дает вам [10,9,8,7,6,5,4,3,2,1].

Я привел примеры со списками, но строки - это еще одна последовательность и работают одинаково. Таким образом, a[::-1] означает построить строку, соединяя символы, которые вы получаете, идя назад через строку.

+0

«Правильная вещь» может быть немного запутанной при использовании отрицательного шага/шага. [Пример здесь] (http://stackoverflow.com/q/399067/936083). – Darthfett

2

Это называется фрагмент нотация в Python, и вы можете прочитать немного больше о том, как она работает здесь:

Explain Python's slice notation

3

Это extended slice notation:

sequence[start:end:step] 

В этом случае, шаг -1 означает обратную сторону, и опускание начала и конца означает, что вы хотите всю строку.

7

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

Итак, в двух словах, если a = '12345':

  • a[::2] становится 135
  • a[::-1] становится 54321
  • a[::-2] становится 531
2

Она использует расширенную нарезку - строка представляет собой последовательность в Python, и делится некоторыми методами с другими последовательностями (na списки и кортежи). Нарезка состоит из трех частей: старт, остановка и шаг. Все они имеют значения по умолчанию - начинают по умолчанию 0, останавливают значения по умолчанию для len (последовательность) и по умолчанию по умолчанию - 1. При указании [:: - 1] вы говорите «все элементы в последовательности a, начиная с начала , до конца происходит в обратном направлении по одному за раз.

Эта функция была введена в Python 2.3.5, и вы можете прочитать в What's New docs.

2

[:: - 1] дает кусочек строки a. полный синтаксис равен a[begin:end:step] , который дает [начало], [начало + шаг], ... a [конец-1]. Если этот шаг отрицательный, вы начинаете с конца и начинаете двигаться.

И наконец, начните по умолчанию начало последовательности, конец до конца и шаг до -1.

1

Строка представляет собой последовательность символов, и на ней работает операция разрезания. Фактически вы делаете:

-> получить фрагмент 'a' от начала до конца с шагом 1 назад.

5

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

for char in reversed(myString): 
    print(char, end = "") 
+0

что это 'end = ""' для? –

+0

Это первый способ python, который не обновляется в конце каждой печати. В python 2.x вы можете просто написать print (char,) –

+0

Конечно, это печатает строку; он не создает новую строку, которая является старой строкой, измененной («.join (reverseed (myString)) сделает это, однако). –

1

Я хотел бы сделать это следующим образом:

variable = "string" 
message = "" 
for b in variable: 
    message = b+message 
print (message) 

и печатает: gnirts

0

Рассмотрим список ниже

l=[12,23,345,456,67,7,945,467] 

Еще одна уловка для изменения списка может быть:

l[len(l):-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12] 

l[:-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12] 

l[len(l)::-1] [467, 945, 7, 67, 456, 345, 23, 12] 
0

мы можем использовать Append и поп сделать его

def rev(s): 
    i = list(s) 
    o = list() 
    while len(i) > 0: 
     o.append(t.pop()) 

    return ''.join(o) 
+0

Почему вы предлагаете альтернативный метод для изменения строки, когда OP явно хочет знать, почему работает 'a [:: - 1]'? – rayryeng

+0

Это не тот ответ, пожалуйста, прочитайте вопрос еще раз. – Aniruddha

1

Это основной шаг обозначения, рассмотрим функциональность:

в [ 2: 4: 2]

Что происходит, так как индекс нарезается между позициями 2 и 4, что делает третья переменная, он устанавливает размер шага, начиная с первое значение. В этом случае он возвратит значение [2], так как a [4] является верхней границей, только два значения возвращаются и второй шаг не выполняется. Оператор (-) минус просто отменяет выход шага.

0

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

def reverse(s): 

    if len(s)==2: 
    return s[-1] + s[0] 

    if len(s)==1: 
    return s[0] 

    return s[-1] + reverse(s[1:len(s)-1]) + s[0] 
Смежные вопросы