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

каков наилучший способ зацикливания строки 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

10 ответов


попробовать отменено builtin:

for c in reversed(string):
     print c

на обратная() вызов сделает итератор, а не копирование всей строки.

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


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

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

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

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

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

это легко понять. Ни reversed, ни enumerate нужно сделать копию строки.

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


меньше кода обычно быстрее в 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

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


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

for c in reversed(string):
    print c

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


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

будет делать то, что я думаю, что вы хотите. Он использует итератор. Это должно работать со всем, что__ reveresed __() или__ len __() и__ getitem _ _ () реализовано. __getitem__ () должен был бы принимать аргументы int, начинающиеся с 0.


 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

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

отменить строку в Python, используя for Loop

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

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

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

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