简单谈谈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 相关文章推荐
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
浅析Python中将单词首字母大写的capitalize()方法
May 18 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
Python中的取模运算方法
Nov 10 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
Python3常用内置方法代码实例
Nov 18 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
python+opencv实现车牌定位功能(实例代码)
Dec 24 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
使用AJAX和Django获取数据的方法实例
Oct 25 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 Python
Django使用echarts进行可视化展示的实践
Jun 10 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
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
javascript调试说明
2010/06/07 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
angular.element方法汇总
2015/01/07 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python入门篇之条件、循环
2014/10/17 Python
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
用Python给文本创立向量空间模型的教程
2015/04/23 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
python 类详解及简单实例
2017/03/24 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
社区学习十八大感想
2014/01/22 职场文书
小学新教师培训方案
2014/02/03 职场文书
激励员工的口号
2014/06/16 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
《学会看病》教学反思
2016/02/17 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript