python的惊艳之举--源于一个同事分享16种字符串反转方式
日期:2018/12/19
最近刚学习了Python的入门课程,准备寻找你的进阶门路,偶尔得到一个老同事微信分享,标题让我这种greenhand心砰砰砰...
好了,看标题:
面试官让用 5 种 python 方法实现字符串反转 ?对不起我有16种……
放链接:
https://mp.weixin.qq.com/s?__biz=MzU0OTU5OTI4MA==&mid=2247485774&idx=2&sn=5044d0c47e13f5d98aa10608b45be6b5&chksm=fbac2811ccdba107cd721d784098cc431b95fc468f7af580340f9e33fa5f9ab4a36ece684b9e&mpshare=1&scene=1&srcid=1219boMIXskRznVvMY5jRpnG&from=singlemessage&ascene=1&devicetype=android-27&version=26060739&nettype=cmnet&abtest_cookie=BAABAAoACwASABQABAAllx4AV5keAJuZHgClmR4AAAA%3D&lang=zh_CN&pass_ticket=r%2BXIohrbTiL%2FnZiTtmpiMk6LHImwbhdifaIs8kalFj%2FdvcG%2ForO1nlDJsYcNqfuv&wx_header=1
好了,上面的是给各位看的,下面是greenhand自己敲的代码,学习代码不能只看,必须得敲敲敲,没有敲糊掉整个键盘字母的人不配说自己学过代码。。。。。。。
方法一:反转列表法
1 a = 'abcdef'
2 b = list(a)
3 b.reverse()
4 b = ''.join(b)
5 print(b)
此方法利用先将字符串转换为列表,然后利用列表的reverse()方法将各元素反转出来,最后利用join()函数将列表的各个元素连接成字符串;
方法二:正向循环法
1 a = 'abcdef'
2 b = ''
3 for i in a:
4 b = i + b
5 print(b)
此方法将原字符串中的字符正序取出,然后将取出的字符串通过+操作与新字符串连接
方法三:反向循环法:
1 a = 'abcdef'
2 b = ''
3 for i in a[::-1]:
4 b = b + i
5 print(b)
此方法将原字符串中的字符逆序取出,并用新字符串与取出的字符执行+操作;
方法四:倒叙切片法:
1 a = 'abcdef'
2 b = a[::-1]
3 print(b)
a[::-1]是将列表反过来,so easy!!
方法五:遍历索引法
1 a = 'abcdef'
2 b = ''
3 for i in range(len(a)+1):
4 b += a[-i]
5 print(b)
此方法将通过索引号逆向取出每个元素,并将元素内容添加 到新的字符串中
方法六:列表弹出法
1 a = 'abcdef'
2 b = ''
3 a = list(a)
4 while len(a) > 0:
5 b += a.pop()
6 print(b)
此方法利用列表的pop()方法依次弹出栈底,即列表的最后一个元素,进行反转
方法七:累积相加法
1 a = 'abcdef'
2 from functools import reduce
3 def exchange(x,y):
4 return y + x
5 b = reduce(exchange,a)
6 print(b)
此方法借助了reduce(function,iterable[,initializer])对iterable中元素的function作用。
1、先定义了两个exchange(),实现两个字符的交换(在这个场景下+实现的是字符交换,如果传递的参数是数值,这是累积求和);
2、reduce利用exchange先交换字符串中第1,2个元素,然后得到的结果与第三个字符重复执行exchange,依次向下,最后得到逆序字符串
方法八:匿名函数法
1 a = 'abcdef'
2 from functools import reduce
3 b = reduce(lambda x, y: y+x, a)
4 print(b)
这是方法七的升级版,理解了reduce的使用,代码简化更条理。
方法九:列表倒叙法
1 a = 'abcdef'
2 a = list(a)
3 a.sort(reverse=True)
4 b = ''.join(a)
5 print(b)
sort(reverse=True)方法,倒序排列。
这个方法有一个弊端,不是按字符串的顺序进行升序或降序排列,而是按英语26个字母进行排序,所以,如果字符串不是按从小到大排列,那么运行后,排序会是错误的。
方法十:双向队列左装法
1 a = 'abcdef'
2 import collections
3 b = collections.deque()
4 for i in a:
5 b.appendleft(i)
6 b = ''.join(b)
7 print(b)
此方法借助数据结构:双向队列,方便的向序列的两边进行添加,删除元素。
通过遍历的方式一次获取了字符串元素,然后通过左插入的方式向队列插入元素,最后再通过join()的方法组合成字符串
方法十一:双向队列逆序法
1 a = 'abcdef'
2 import collections
3 b = collections.deque()
4 b.extend(list(a))
5 b.reverse()
6 b = ''.join(b)
7 print(b)
此方法通过extend()原字符串的内容插入到目的字符串中,然后再利用[::-1]反转字符串。
方法十二:一维数组结构
1 a = 'abcdef'
2 import pandas as pd
3 b = pd.Series(list(a))
4 b = ''.join(b[::-1])
5 print(b)
通过pandas的Series生成一维数组结构,再进行反转
方法十三:递归函数方法
1 a = 'abcdef'
2 def f(a):
3 if len(a) <= 1:
4 return a
5 return a[-1] + f(a[:-1])
6 b = f(a)
7 print(b)
采用递归函数,注意递归结束的条件;
方法十四:对称交换法
1 a = 'abcdef'
2 def f(a):
3 a = list(a)
4 if len(a) <=1:
5 return a
6 i = 0
7 length = len(a)
8 while i < length/2:
9 a[i],a[length - 1 - i] = a[length - 1 - i],a[i]
10 i += 1
11 return ''.join(a)
12 b = f(a)
13 print(b)
在以往的数值互换中,我们都需要借助临时变量tmp实现a = 2,b = 3的互换,但在python中可以直接通过 a,b= b,a实现,此方法也是Python特有的方法。
上面例子就是取对称位置的数值按照python特有的方法交换两个对称位置处的字符达到反转的目的。
方法十五:列表解析式法
1 a = 'abcdef'
2 b = ''.join(i for i in a[::-1])
3 print(b)
方法三的简便写法,使用列表解析式,简化代码书写。最后同样通过join()方法,反转合并字符串
方法十六:反向遍历法
1 a = 'abcdef'
2 b = ''
3 for i in range(1, len(a[::-1])+1):
4 b += a[-i]
5 print(b)
此方法是方法五的逆向思维,个人更倾向于将这种方法归纳为方法五的另一种表达方式
python的惊艳之举--源于一个同事分享16种字符串反转方式的更多相关文章
- python——3种字符串反转方法
在学习过程中,总结了3种字符串反转方法: 1.切片法 这种方法最为简便 str='abad' print(str[::-1]) · 用切片操作,将字符串以步长-1重新整理,即 'str[-1],str ...
- 手敲代码太繁琐?“拖拉拽”式Python编程惊艳到我了
Python到底有多火,从后端开发到前端开发:从金融量化分析到大数据:从物联网到人工智能,都有Python的踪迹. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后, ...
- Python 技巧(三)—— list 删除一个元素的三种做法
我们以一个字符串为元素类型的 list 为例,进行列表元素的删除: >>> l = ['no surfing', 'flippers'] 1 法一:remove(val) >& ...
- python字符串连接方式(转)
在python中有很多字符串连接方式,今天就在这里具体总结一下: ①.最原始的字符串连接方式:str1 + str2②.python 新字符串连接语法:str1, str2③.奇怪的字符串方式:str ...
- python实战===2017年30个惊艳的Python开源项目 (转)
本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...
- uperTextView-从未如此惊艳!一个超级的TextView
简介 下载:http://www.see-source.com/androidwidget/detail.html?wid=1273 欢迎使用SuperTextView,这篇文档将会向你展示如何使用这 ...
- 惊艳的cygwin——Windows下的Linux命令行环境的配置和使用
http://www.tuicool.com/articles/2MramqI 时间 2014-07-29 09:28:36 点滴之间 聚沙成金 原文 http://www.path8.net/t ...
- 那些惊艳的 GIS 轮子
一.前言 GIS 涉及测绘.几何拓扑.人文社科等多方面的科学知识.在 .Net 平台下有着许多优秀的开源产品,比如:MapWindow.SharpMap.WorldWind等.而在这其中,Coordi ...
- CURD系统怎么做出技术含量惊艳面试官
在<CURD系统怎么做出技术含量--怎样引导面试>有朋友开玩笑说都用上了领域驱动了,就不叫CURD系统了吧.这里我解释一下,怕大家对DDD领域驱动设计有什么误解. DDD是为解决软件复杂性 ...
- 理解C# 4 dynamic(4) – 让人惊艳的Clay
Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象.Clay和ExpandoObject相比, ...
随机推荐
- 解决veture和eslint冲突的问题
vscoder自带的veture和eslint存在冲突,主要表现在 末尾逗号,分号,单双引号的不一致.解决办法:1.npm install --save-dev prettier2.在根目录新建.pr ...
- 【深入浅出 Yarn 架构与实现】4-5 RM 行为探究 - 启动 ApplicationMaster
本节开始,将对 ResourceManager 中一些常见行为进行分析探究,看某些具体关键的行为,在 RM 中是如何流转的.本节将深入源码探究「启动 ApplicationMaster」的具体流程. ...
- Classical Cipher
[NPUCTF2020]Classical Cipher 难得做到一道古典密码的题目,打开后有一个flag.zip和一个提示. 解密后的flag请用flag{}包裹 压缩包密码:gsv_pvb_rh_ ...
- taro框架开发微信小程序遇到的问题
ios端,如果input放在了dispplay flex里面,会导致一系列问题 滑动屏幕,键盘不收起,input值随屏幕滚动 input之前切换,键盘不弹起来或有时弹有时不弹 键盘莫名收起 input ...
- java8 Stream API之reduce
通过前面那篇文章,我们已经对Stream API有了初步的认识,并对它在集合处理中的增强作用表示了肯定.同时我们上篇中示例了forEach.fiter.sum这些常用的功能,本篇我们只讲reduce. ...
- Java实现简单薪水计算器相关操作代码
/** * 薪水计算器 * 1.通过键盘输入用户的月薪,每年是几个薪水 * 2.输出用户年薪 * 3.输出一行字"如果年薪超过10万,恭喜你超越了90%的国人:如果年薪超过了20万,恭喜你超 ...
- React Navite环境搭建
俗话说"工欲善其事,必先利其器."所以,我们第一步就是搭建React Native开发坏境. 一.安装Node.js.npm.yarn 1.1 React native需要借助no ...
- 窗口退出&初始化
class Test(QtWidgets.QMainWindow, Ui_dlg): def closeEvent(self, e): #to do super().closeEvent(e) def ...
- 每次 git 都需要输入用户名和密码的解决办法
git config --global credential.helper store git pull /git push (第一次输入,下次就不用再次输入数据)
- phpstudy 配置域名解决index.php 过多重定向
server { listen 80; server_name www.cqtldd.com cqtldd.com; root "D:/phpstudy_pro/WWW/tongliangd ...