在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
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