简单谈谈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程序中的运用
Mar 02 Python
python实现域名系统(DNS)正向查询的方法
Apr 19 Python
python实现的二叉树定义与遍历算法实例
Jun 30 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
Python实现分段线性插值
Dec 17 Python
python根据txt文本批量创建文件夹
Dec 08 Python
python实现AES加密和解密
Mar 27 Python
Python实现Selenium自动化Page模式
Jul 14 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
Python 用三行代码提取PDF表格数据
Oct 13 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
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
PHP 操作文件的一些FAQ总结
2009/02/12 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
python实现360皮肤按钮控件示例
2014/02/21 Python
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
领导班子作风建设年个人整改措施
2014/09/29 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
医者仁心观后感
2015/06/17 职场文书
关于感恩的作文
2019/08/26 职场文书
导游词之崇武古城
2019/10/07 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android