Лучший способ перебрать строку питона в обратном направлении - PullRequest
38 голосов
/ 01 ноября 2011

Как лучше всего перебрать строку питона в обратном направлении?

Следующее выглядит немного неловко из-за необходимости смещения -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 ]

70 голосов
/ 01 ноября 2011

Попробуйте обратный встроенный:

for c in reversed(string):
     print c

Вызов reversed () создаст итератор, а не скопирует всю строку.

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

5 голосов
/ 20 марта 2013

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

def reverse(text):
    rev = ''
    for i in range(len(text), 0, -1):
        rev += text[i-1]
    return rev
4 голосов
/ 01 ноября 2011

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

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

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

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

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

3 голосов
/ 01 ноября 2011

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

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

3 голосов
/ 01 ноября 2011
 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
2 голосов
/ 01 ноября 2011
string = "trick or treat"
for c in reversed(string):
    print c

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

2 голосов
/ 01 ноября 2011

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

for c in reversed(string):
    print c

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

1 голос
/ 23 июня 2016

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

outputStr = ''
a = raw_input("Enter String: ")
for i in range(len(a), 0, -1):
    outputStr += a[i-1]
print outputStr
1 голос
/ 13 августа 2015
def reverse(text):
    x = ""
    for i in range(len(text)):
        x = x + text[len(text)-i-1]
    return x
0 голосов
/ 16 августа 2017

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

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

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

...