简单谈谈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中集合的内建函数和内建方法学习教程
Aug 19 Python
python实现文本去重且不打乱原本顺序
Jan 26 Python
Python实现返回数组中第i小元素的方法示例
Dec 04 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
Python设计模式之建造者模式实例详解
Jan 17 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
Python while true实现爬虫定时任务
Jun 08 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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基于GD库的图像处理方法小结
2016/09/27 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
JS之小练习代码
2008/10/12 Javascript
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
JavaScript驾驭网页-获取网页元素
2016/03/24 Javascript
Js+Ajax,Get和Post在使用上的区别小结
2016/06/08 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
美国高档帽子网上商店:Hats.com
2018/08/09 全球购物
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
婚前协议书范本
2014/04/15 职场文书
设备售后服务承诺书
2014/05/30 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
观后感格式
2015/06/19 职场文书