简单谈谈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使用os模块的os.walk遍历文件夹示例
Jan 27 Python
Python读写ini文件的方法
May 28 Python
python中os和sys模块的区别与常用方法总结
Nov 14 Python
Django在win10下的安装并创建工程
Nov 20 Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
浅谈keras使用中val_acc和acc值不同步的思考
Jun 18 Python
python中selenium库的基本使用详解
Jul 31 Python
python的launcher用法知识点总结
Aug 07 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
深入探讨opencv图像矫正算法实战
May 21 Python
在Python 中将类对象序列化为JSON
Apr 06 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
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
常见JS验证脚本汇总
2015/12/01 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
React组件refs的使用详解
2018/02/09 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
Python pickle模块用法实例
2015/04/14 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
python实现飞机大战项目
2020/03/11 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
python 如何快速复制序列
2020/09/07 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
《乞巧》教学反思
2014/02/27 职场文书
房屋租赁意向书
2014/04/01 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
个性与发展自我评价
2015/03/06 职场文书
房贷收入证明范本
2015/06/12 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
在redisCluster中模糊获取key方式
2021/07/09 Redis
html5实现点击弹出图片功能
2021/07/16 HTML / CSS