简单谈谈Python中的反转字符串问题


Posted in Python onOctober 24, 2016

按单词反转字符串是一道很常见的面试题。在Python中实现起来非常简单。

def reverse_string_by_word(s):
 lst = s.split() # split by blank space by default
 return ' '.join(lst[::-1])

s = 'Power of Love'
print reverse_string_by_word(s)
# Love of Power

s = 'Hello World!'
print reverse_string_by_word(s)
# World! Hello

上面的实现其实已经能满足大多数情况,但是并不完美。比如第二个字符串中的感叹号并没有被翻转,而且原字符串中的空格数量也没有保留。(在上面的例子里其实Hello和World之间不止一个空格)

我们期望的结果应该是这样子的。

print reverse_string_by_word(s)
# Expected: !World Hello

要改进上面的方案还不把问题复杂化,推荐使用re模块。你可以查阅re.split() 的官方文档。我们看一下具体例子。

>>> import re
>>> s = 'Hello World!'

>>> re.split(r'\s+', s) # will discard blank spaces
['Hello', 'World!']

>>> re.split(r'(\s+)', s) # will keep spaces as a group
['Hello', ' ', 'World!']

>>> s = '< Welcome to EF.COM! >'

>>> re.split(r'\s+', s) # split by spaces
['<', 'Welcome', 'to', 'EF.COM!', '>']

>>> re.split(r'(\w+)', s) # exactly split by word
['< ', 'Welcome', ' ', 'to', ' ', 'EF', '.', 'COM', '! >']

>>> re.split(r'(\s+|\w+)', s) # split by space and word
['<', ' ', '', 'Welcome', '', ' ', '', 'to', '', ' ', '', 'EF', '.', 'COM', '!', ' ', '>']

>>> ''.join(re.split(r'(\s+|\w+)', s)[::-1])
'> !COM.EF to Welcome <'

>>> ''.join(re.split(r'(\s+)', s)[::-1])
'> EF.COM! to Welcome <'

>>> ''.join(re.split(r'(\w+)', s)[::-1])
'! >COM.EF to Welcome< '

如果你觉得用切片将序列倒序可读性不高,那么其实也可以这样写。

>>> ''.join(reversed(re.split(r'(\s+|\w+)', s)))
'> !COM.EF to Welcome <'

一句话搞定,so easy!

Python翻转字符串(reverse string), 一共包含5种方法, 其中第一种最简单, 即步长为-1, 输出字符串;

方法如下

5种方法的比较:

1. 简单的步长为-1, 即字符串的翻转(常用);
2. 交换前后字母的位置;
3. 递归的方式, 每次输出一个字符;
4. 双端队列, 使用extendleft()函数;
5. 使用for循环, 从左至右输出;

代码:

# -*- coding: utf-8 -*- 
 
#eclipse pydev, python 3.3 
#by C.L.Wang 
#time: 2014. 4. 11 
 
string = 'abcdef' 
 
def string_reverse1(string): 
 return string[::-1] 
 
def string_reverse2(string): 
 t = list(string) 
 l = len(t) 
 for i,j in zip(range(l-1, 0, -1), range(l//2)): 
  t[i], t[j] = t[j], t[i] 
 return "".join(t) 
 
def string_reverse3(string): 
 if len(string) <= 1: 
  return string 
 return string_reverse3(string[1:]) + string[0] 
 
from collections import deque 
def string_reverse4(string): 
 d = deque() 
 d.extendleft(string) 
 return ''.join(d) 
 
def string_reverse5(string): 
 #return ''.join(string[len(string) - i] for i in range(1, len(string)+1)) 
 return ''.join(string[i] for i in range(len(string)-1, -1, -1)) 
 
print(string_reverse1(string)) 
print(string_reverse2(string)) 
print(string_reverse3(string)) 
print(string_reverse4(string)) 
print(string_reverse5(string))

输出:

fedcba 
fedcba 
fedcba 
fedcba 
fedcba
Python 相关文章推荐
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
一张图带我们入门Python基础教程
Feb 05 Python
python中实现k-means聚类算法详解
Nov 11 Python
点球小游戏python脚本
May 22 Python
python中验证码连通域分割的方法详解
Jun 04 Python
python+splinter自动刷新抢票功能
Sep 25 Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
Python 高级库15 个让新手爱不释手(推荐)
May 15 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 Python
Python 内置函数complex详解
Oct 23 #Python
Python检测生僻字的实现方法
Oct 23 #Python
python 写入csv乱码问题解决方法
Oct 23 #Python
解决Python中字符串和数字拼接报错的方法
Oct 23 #Python
python 读写txt文件 json文件的实现方法
Oct 22 #Python
Python类属性的延迟计算
Oct 22 #Python
如何在Python函数执行前后增加额外的行为
Oct 20 #Python
You might like
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
node.js中的fs.readlink方法使用说明
2014/12/17 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
python实现的各种排序算法代码
2013/03/04 Python
详解Python中的__init__和__new__
2014/03/12 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
如何使用Python自动控制windows桌面
2019/07/11 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
python接入支付宝的实例操作
2020/07/20 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
信息管理专业学生自荐信格式
2013/09/22 职场文书
大学毕业生通用求职信
2013/09/28 职场文书
爬山的活动方案
2014/08/16 职场文书