Подтвердить что ты не робот

Лучший способ петли над питонной строкой назад

Каков наилучший способ перебрать строку python назад?

Следующее кажется немного неудобным для всей необходимости смещения -1:

string = "trick or treat"
for i in range(len(string)-1, 0-1, -1):
    print string[i]

Следующее выглядит более кратким, но действительно ли оно генерирует обратную строку, чтобы было незначительное ограничение производительности?

string = "trick or treat"
for c in string[::-1]:
    print c
4b9b3361

Ответ 1

Попробуйте reversed builtin:

for c in reversed(string):
     print c

Обратный вызов() вызывает итератор вместо копирования всей строки.

PEP 322 детализирует мотивацию для reverse() и ее преимущества по сравнению с другими подходами.

Ответ 2

Здесь вы можете изменить строку без использования встроенных функций, таких как reversed. Отрицательные значения шага обращаются назад.

def reverse(text):
    rev = ''
    for i in range(len(text), 0, -1):
        rev += text[i-1]
    return rev

Ответ 3

Да, второй ярлык синтаксиса создает промежуточную строку и имеет связанное с этим ограничение производительности.

Первая версия лучше написана как:

for index, char in enumerate(reversed(s)):
   print "pos %d: %s" % (index, char)

Это легко понять. Ни reversed, ни enumerate `необходимо сделать копию строки.

Также будьте осторожны с использованием string в качестве имени переменной, так как это также имя модуля в стандартной библиотеке.

Ответ 4

 string = "trick or treat"
 for c in string[::-1]:
     print c

Я бы это использовал. Вероятно, это довольно быстро, хотя может быть немного лучше (но я сомневаюсь).

EDIT: На самом деле, со вторым тестом, используя программу, которую я взломал вместе, reversed, вероятно, путь.

 ==== Results ====
Sample 1: 0.0225071907043 # Using a for loop
Sample 2: 0.0100858211517 # Using reversed

Ответ 5

Меньший код, как правило, быстрее в Python. К счастью, вам не нужно гадать:

python -mtimeit -s"s='x'*100000" "for x in s[::-1]: pass"
100 loops, best of 3: 1.99 msec per loop

python -mtimeit -s"s='x'*100000" "for x in reversed(s): pass"
1000 loops, best of 3: 1.97 msec per loop

python -mtimeit -s"s='x'*100000" "for i in xrange(len(s)-1, 0-1, -1): s[i]"
100 loops, best of 3: 4.95 msec per loop

Таким образом, более короткий код немного быстрее, но он имеет накладные расходы памяти.

Ответ 6

reversed выполняет итерацию и возвращает итератор, который перемещается назад. string[::-1] отлично, но вместо этого создается новая, обратная строка. Если вы просто хотите итерации, то это, вероятно, лучше:

for c in reversed(string):
    print c

Если вы хотите использовать обратную строку после этого, создание ее однажды будет лучше.

Ответ 7

string = "trick or treat"
for c in reversed(string):
    print c

Будет делать то, что я думаю, вы хотите. Он использует итератор. Это должно работать с чем-либо, что реализовано __reveresed __() или __len __() и __getitem __(). __getitem __() должен принимать значения int начиная с 0.

Ответ 8

def reverse(text):
    x = ""
    for i in range(len(text)):
        x = x + text[len(text)-i-1]
    return x

Ответ 9

Обратить строку в Python, используя для цикла

outputStr = ''
a = raw_input("Enter String: ")
for i in range(len(a), 0, -1):
    outputStr += a[i-1]
print outputStr

Ответ 10

Python 3 с методами enumerate и reversed:

string = "trick or treat"
for i, c in enumerate(reversed(string)):
    print(i, c)

Вы можете использовать print (c) только для получения каждого символа без индекса.

Ответ 11

Это действительно простой способ решить эту проблему:

uString = input("Enter phrase")

newString = ""

print(uString) #this shows what it was before reversed.

for elem in uString[::-1]:
    newString += elem

print(newString)