Python的str对象没有内置的反向函数。实施此方法的最佳方式是什么?

如果提供一个非常简洁的答案,请详细说明其效率。例如,str对象是否转换为其他对象等。


当前回答

这里有一个不花哨的:

def reverse(text):
    r_text = ''
    index = len(text) - 1

    while index >= 0:
        r_text += text[index] #string canbe concatenated
        index -= 1

    return r_text

print reverse("hello, world!")

其他回答

def reverse(input):
    return reduce(lambda x,y : y+x, input)

这也是一种有趣的方式:

def reverse_words_1(s):
    rev = ''
    for i in range(len(s)):
        j = ~i  # equivalent to j = -(i + 1)
        rev += s[j]
    return rev

或类似:

def reverse_words_2(s):
    rev = ''
    for i in reversed(range(len(s)):
        rev += s[i]
    return rev

另一种更“奇特”的方式使用支持.reverse()的字节数组

b = bytearray('Reverse this!', 'UTF-8')
b.reverse()
b.decode('UTF-8')`

将产生:

'!siht esreveR'

作为一种不同的解决方案(因为面试中会问到):

def reverse_checker(string):
    ns = ""
    for h in range(1,len(string)+1):
        ns  += string[-h]
    print(ns)

    if ns == string:
        return True
    else:
        return False

这里有一个不花哨的:

def reverse(text):
    r_text = ''
    index = len(text) - 1

    while index >= 0:
        r_text += text[index] #string canbe concatenated
        index -= 1

    return r_text

print reverse("hello, world!")

快速回答(TL;DR)

实例

### example01 -------------------
mystring  =   'coup_ate_grouping'
backwards =   mystring[::-1]
print(backwards)

### ... or even ...
mystring  =   'coup_ate_grouping'[::-1]
print(mystring)

### result01 -------------------
'''
gnipuorg_eta_puoc
'''

详细答案

出身背景

提供此答案是为了解决@odigity的以下问题:

哇!起初我对保罗提出的解决方案感到震惊,但坐在后排,我读了第一本书后感到恐惧评论:“这很像蟒蛇。干得好!”一个聪明的社区认为用这种神秘的方法来做这样的事情basic是个好主意。为什么不只是s.reverse()?

问题

上下文Python 2.xPython 3.x脚本:开发人员希望转换字符串转换是颠倒所有字符的顺序

解决方案

example01使用扩展切片表示法生成所需的结果。

陷阱

开发人员可能需要类似string.reverse()的内容本机惯用(又称“pythonic”)解决方案可能对较新的开发人员不可读开发人员可能会尝试实现自己版本的string.reverse(),以避免切片表示法。在某些情况下,切片符号的输出可能与直觉相反:参见例如示例02打印'coup_ate_grouping'[-4:]##=>'ping'与…相比打印'coup_ate_grouping'[-4:-1]##=>'pin'与…相比打印'coup_ate_grouping'[-1]##=>'g'对[-1]进行索引的不同结果可能会让一些开发人员望而却步

根本原因

Python有一个特殊的情况需要注意:字符串是一种可迭代的类型。

排除string.reverse()方法的一个理由是让python开发人员有动力利用这种特殊情况的力量。

简单地说,这意味着字符串中的每个字符都可以作为元素顺序排列的一部分进行操作,就像其他编程语言中的数组一样。

为了了解这是如何工作的,回顾示例02可以提供一个很好的概述。

示例02

### example02 -------------------
## start (with positive integers)
print 'coup_ate_grouping'[0]  ## => 'c'
print 'coup_ate_grouping'[1]  ## => 'o' 
print 'coup_ate_grouping'[2]  ## => 'u' 

## start (with negative integers)
print 'coup_ate_grouping'[-1]  ## => 'g'
print 'coup_ate_grouping'[-2]  ## => 'n' 
print 'coup_ate_grouping'[-3]  ## => 'i' 

## start:end 
print 'coup_ate_grouping'[0:4]    ## => 'coup'    
print 'coup_ate_grouping'[4:8]    ## => '_ate'    
print 'coup_ate_grouping'[8:12]   ## => '_gro'    

## start:end 
print 'coup_ate_grouping'[-4:]    ## => 'ping' (counter-intuitive)
print 'coup_ate_grouping'[-4:-1]  ## => 'pin'
print 'coup_ate_grouping'[-4:-2]  ## => 'pi'
print 'coup_ate_grouping'[-4:-3]  ## => 'p'
print 'coup_ate_grouping'[-4:-4]  ## => ''
print 'coup_ate_grouping'[0:-1]   ## => 'coup_ate_groupin'
print 'coup_ate_grouping'[0:]     ## => 'coup_ate_grouping' (counter-intuitive)

## start:end:step (or start:end:stride)
print 'coup_ate_grouping'[-1::1]  ## => 'g'   
print 'coup_ate_grouping'[-1::-1] ## => 'gnipuorg_eta_puoc'

## combinations
print 'coup_ate_grouping'[-1::-1][-4:] ## => 'puoc'

结论

对于一些不想花太多时间学习python的采纳者和开发人员来说,与理解python中的切片表示法的工作原理相关的认知负荷可能确实太大了。

然而,一旦了解了基本原理,这种方法相对于固定字符串操作方法的威力就会非常大。

对于那些不这么想的人,有其他方法,例如lambda函数、迭代器或简单的一次性函数声明。

如果需要,开发人员可以实现自己的string.reverse()方法,但最好理解python这方面的原理。

另请参见

替代简单方法替代简单方法切片表示法的另一种解释