在Python中反向遍历字符串的最佳方式

73 投票
12 回答
154765 浏览
提问于 2025-04-17 05:23

如何以最好的方式反向遍历一个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

12 个回答

7

reversed 是一个可以接受可迭代对象(比如列表、字符串等)的函数,它会返回一个可以向后遍历的迭代器。用 string[::-1] 也可以实现反转字符串,但这样会生成一个新的反转字符串。如果你只是想遍历字符串,使用 reversed 可能会更好:

for c in reversed(string):
    print c

如果你之后还想使用反转后的字符串,创建一次会更好。

10

编辑:我写这个回答已经有一段时间了。这种方法并不是很符合 Python 的风格,也不是最有效的反向遍历字符串的方式。它展示了如何利用范围和负步长的值,通过循环字符串,把字符串末尾的元素添加到新值的前面。不过,这种方法容易出错,使用内置的 reversed 函数会更好。对于那些想了解 reversed 是如何实现的读者,可以看看 PEP 322,了解一下它的原理和原因。这个函数会检查传入的参数是否可以迭代,然后从列表中逐个返回最后的元素,直到没有更多的元素可以返回。从 PEP 中可以看到:

[reversed] 为支持 getitem() 和 len() 的序列对象创建一个反向迭代器。

所以,要反转一个字符串,就要一直使用这个迭代器,直到它耗尽。如果不使用内置函数,可能会像这样:

def reverse_string(x: str) -> str:
i = len(x)
while i > 0:
    i -= 1
    yield x[i]
    

可以通过循环来消耗这个迭代器,比如:

for element in (reverse_string('abc')): 
    print(element)

或者调用一个构造函数,比如:

cba = list(reverse_string('abc'))

这个 reverse_string 的代码几乎和 PEP 一样,只是为了简单起见去掉了一些检查。实际上,建议使用内置函数。

原始回答:

这里有一种不使用内置功能(比如 reversed)来反转字符串的方法。负步长的值可以让我们反向遍历。

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

试试这个内置的 reversed 函数:

for c in reversed(string):
     print c

使用 reversed() 这个函数时,它会生成一个迭代器,而不是把整个字符串复制一遍。

PEP 322 详细说明了使用 reversed() 的原因,以及它相比其他方法的优点。

撰写回答