向后循环python字符串的最佳方法

clw*_*wen 41 python string optimization reverse iterator

向后循环python字符串的最佳方法是什么?

对于-1偏移的所有需要​​,以下似乎有点尴尬:

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

以下看起来更简洁,但实际上它是否产生了反向字符串,因此会有轻微的性能损失?

string = "trick or treat"
for c in string[::-1]:
    print c
Run Code Online (Sandbox Code Playgroud)

Ray*_*ger 75

尝试颠倒的内置:

for c in reversed(string):
     print c
Run Code Online (Sandbox Code Playgroud)

扭转()调用会使一个迭代器,而不是复制整个字符串.

PEP 322详述了reverse()的动机及其优于其他方法的优点.

  • `reversed`不支持缓冲协议,因此不适合`re`。 (2认同)

AJ0*_*200 5

 string = "trick or treat"
 for c in string[::-1]:
     print c
Run Code Online (Sandbox Code Playgroud)

我会用那个。尽管可能有更好的方法(但我对此表示怀疑),但它可能相当快。

编辑: 实际上,使用我编写的程序进行第二次测试reversed可能是正确的方法。

 ==== Results ====
Sample 1: 0.0225071907043 # Using a for loop
Sample 2: 0.0100858211517 # Using reversed
Run Code Online (Sandbox Code Playgroud)


Tri*_*ych 5

是的,第二个语法快捷方式创建一个中间字符串并具有相关的性能损失。

第一个版本更好地写为:

for index, char in enumerate(reversed(s)):
   print "pos %d: %s" % (index, char)
Run Code Online (Sandbox Code Playgroud)

这很容易理解。reversed`和`都不enumerate需要复制字符串。

string用作变量名时也要小心,因为它也是标准库中模块的名称。

  • 我不喜欢这个答案,因为使用 enumerate() 会使答案更难理解。这是双重正确的,因为报告的索引是新位置,而不是原始位置。+1建议不要使用“string”作为变量名。 (3认同)

Cat*_*lus 5

reversed接受一个迭代器并返回一个向后移动的迭代器。string[::-1]很好,但它会创建一个新的反向字符串。如果您只想迭代,那么这可能会更好:

for c in reversed(string):
    print c
Run Code Online (Sandbox Code Playgroud)

如果以后要使用反转的字符串,创建一次会更好。


Nat*_*han 5

这是一种在不使用内置功能的情况下反转字符串的方法reversed.负步长值向后移动.

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