简单谈谈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使用redis pool的一种单例实现方式
Apr 16 Python
浅谈编码,解码,乱码的问题
Dec 30 Python
python版简单工厂模式
Oct 16 Python
python pandas 对时间序列文件处理的实例
Jun 22 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
Jul 12 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
详解Python装饰器
Mar 25 Python
python项目对接钉钉SDK的实现
Jul 15 Python
Python 用matplotlib画以时间日期为x轴的图像
Aug 06 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
浅析使用Python搭建http服务器
Oct 27 Python
Python尾递归优化实现代码及原理详解
Oct 09 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
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
用PHP开发GUI
2006/10/09 PHP
php中一个完整表单处理实现代码
2011/11/10 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
单利模式及python实现方式详解
2018/03/20 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
python 回溯法模板详解
2020/02/26 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
学术会议欢迎词
2014/01/09 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
公司租房协议书
2014/10/14 职场文书
检讨书范文1000字
2015/01/28 职场文书
法定代表人免职证明
2015/06/24 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技