您当前的位置:首页 > 计算机 > 编程开发 > Python

Python中的字符串逆序处理

时间:01-01来源:作者:点击数:

在Python中,字符串是一个Unicode字符序列。Python没有内置(built-in)函数或者方法用于字符串逆序处理。有以下几种能够实现字符串的方法。

1. Decreasing slicing

Python中的string slicing的语法如下:

string[start:stop:step]

省略start和stop的设置,step置为’-1’的话就可以得到原字符串的一个逆序的副本。

2. Using reversed() function

内置的函数reversed()对字符串进行逆序处理,但是它不是直接返回原字符串的逆序副本,而是生成一个iterator。可以用”join()”操作符对这个iterator作进一步的处理以生成字符串逆序副本。

3. Using list reverse()

Python中的List有reverse() method,所以可以按以下步骤实现字符串逆序:

  1. 将字符串转换为字符列表
  2. 对字符列表进行逆序处理
  3. 将逆序字符列表再变换回字符串

4. Using recursion function

最后还有一种超级费力的方式,就是用递归函数调用的方式(只有秀编程技巧的价值)。定义一个函数,每次调用将首字符挪到字符串尾部,直到整个字符串顺序完全颠倒为止

参见以下代码示例:

# -*- coding: utf-8 -*-
"""
Created on Thu Aug 19 13:19:27 2021

@author: chenxy
"""

import timeit
from statistics import mean
    
def rev_str_thru_slicing(aStr):
    return aStr[::-1]

def rev_str_thru_join_revd(aStr):
    return "".join(reversed(aStr))	

def rev_str_thru_list_reverse(aStr):
    lst = list(aStr)
    lst.reverse()
    return(''.join(lst))

def rev_str_thru_recursion(aStr):
    if len(aStr) == 0:
        return aStr
    else:
        return rev_str_thru_recursion(aStr[1:]) + aStr[0]

if __name__ == '__main__':
    
    #1. Decreasing slicing
    print('Decreasing slicing:   ','HelloPython'[::-1])
    
    #2. User-defined function based on decreasing slicing
    myStr = "HelloPython"
    print('User-defined function based on:   ',rev_str_thru_slicing(myStr))    

    #3. Using reversed() function
    print('Using reversed() function:    ',rev_str_thru_join_revd(myStr))	
    
    #4. Using list reverse() method
    print('Using list reverse() method:    ',rev_str_thru_list_reverse(myStr))
    
    #4. Using recursive function    
    print('Using recursive function:    ',rev_str_thru_recursion(myStr))

5. 性能比较分析

最后,基于python的timeit模块对以上几种字符串逆序处理方法进行一个统计平均性能对比。Timeit的repeat选项用于对代码进行重复执行,然后可以对运行所耗费的时间进行统计平均以得到平均执行时间。Repeat的单位是1百万次,即repeat设为1时待评估的对象代码会被重复执行1百万次。

    # Performance comparison
    s = myStr * 10
    repeatCount = 10

    SLICING_PERF = timeit.repeat(lambda: rev_str_thru_slicing(s), repeat=repeatCount)
    print(min(SLICING_PERF), mean(SLICING_PERF), max(SLICING_PERF), SLICING_PERF)

    J_R_PERF = timeit.repeat(lambda: rev_str_thru_join_revd(s), repeat=repeatCount)
    print(min(J_R_PERF), mean(J_R_PERF), max(J_R_PERF), J_R_PERF)

    LIST_PERF = timeit.repeat(lambda: rev_str_thru_list_reverse(s), repeat=repeatCount)
    print(min(LIST_PERF), mean(LIST_PERF), max(LIST_PERF), LIST_PERF)

    RECUR_PERF = timeit.repeat(lambda: rev_str_thru_recursion(s), repeat=repeatCount)
    print(min(RECUR_PERF), mean(RECUR_PERF), max(RECUR_PERF), RECUR_PERF)    
    
    ratio0 = mean(SLICING_PERF)/mean(SLICING_PERF)
    ratio1 = mean(J_R_PERF)/mean(SLICING_PERF)
    ratio2 = mean(LIST_PERF)/mean(SLICING_PERF)
    ratio3 = mean(RECUR_PERF)/mean(SLICING_PERF)
    print('SLICING_PERF:J_R_PERF:LIST_PERF:RECUR_PERF = {0}:{1}:{2}:{3}'.format(ratio0,ratio1,ratio2,ratio3))

运行结果:

SLICING_PERF:J_R_PERF:LIST_PERF:RECUR_PERF = 1.0:7.45:6.18:97.43

不出意外,用decreasing slicing的方式最快。而递归实现方式则满了接近两个数量级!

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门