简单谈谈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列表操作实例
Jan 14 Python
Python中random模块用法实例分析
May 19 Python
浅谈Python 的枚举 Enum
Jun 12 Python
详解Django中间件执行顺序
Jul 16 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
Python socket 套接字实现通信详解
Aug 27 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
Python实现钉钉/企业微信自动打卡的示例代码
Feb 02 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
May 19 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下实现折线图效果的代码
2007/04/28 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
2014/01/27 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
Python创建模块及模块导入的方法
2015/05/27 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
我们的节日清明节活动方案
2014/03/05 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
群众路线表态发言材料
2014/10/17 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
督导岗位职责范本
2015/04/10 职场文书
师范生教育见习总结
2015/06/23 职场文书
《分数的意义》教学反思
2016/02/20 职场文书