Лучший способ зациклить строку 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 ответов
вот способ обратить строку без использования встроенных функций, таких как 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
отменить строку в 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) только для извлечения каждого символа без индекса.