2025年3月21日 星期五 甲辰(龙)年 月廿 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python中的字符串逆序处理

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

在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的方式最快。而递归实现方式则满了接近两个数量级!

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