简单谈谈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 Web框架Flask下网站开发入门实例
Feb 08 Python
python Django模板的使用方法
Jan 14 Python
python如何查看系统网络流量的信息
Sep 12 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
python实现用户答题功能
Jan 17 Python
Matplotlib 生成不同大小的subplots实例
May 25 Python
Python File(文件) 方法整理
Feb 18 Python
Python Django框架实现应用添加logging日志操作示例
May 17 Python
python绘制随机网络图形示例
Nov 21 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
Python制作运行进度条的实现效果(代码运行不无聊)
Feb 24 Python
Python标准库之typing的用法(类型标注)
Jun 02 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的cms
2010/12/19 PHP
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
Django自定义认证方式用法示例
2017/06/23 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
python 实现生成均匀分布的点
2019/12/05 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
UGG英国官方网站:UGG UK
2018/02/08 全球购物
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
办公室主任主任岗位责任制
2014/02/11 职场文书
天下第一关导游词
2015/02/06 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
如何写好闭幕词
2019/04/02 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android