原来最简单的字符串反转是这样滴

whoho 2014-08-25 03:39:33
好久不玩python都生疏啦

 
s = 'abc'
t = s[-1::-1] #<<<==========


比较费劲的和低效的方式:
1)通过reversed函数
或者
2)用一个for 循环,逆向遍历字符串,并append给另外一个字符串(起始为''空串)

...全文
420 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2014-08-29
  • 打赏
  • 举报
回复
(我的python版本是2.7.x) reversed应该更快, 因为它的返回值是一个iterator, 也就是说, reversed不用构建新的数组或字符串. 下面的例子(In[52]和In[55])显示reversed对长为一万的字符串和长仅50的字符串,reversed用的时间基本一样. 但要注意reversed只管reverse数据所在的位置,而不管它的内容是什么. 下面的例子里(In[57]到In[60]), reversed object建立之后, 更改原数组的值, reversed的值也会跟着变. 当然, reversed字符串不会有这样的问题, 因为python的字符串是不可改变的.

In [50]: ua = ''.join(random.choice(u'天姥连天向天横 ') for _ in range(10000))

In [51]: len(ua)
Out[51]: 10000

In [52]: %timeit reversed(ua)
10000000 loops, best of 3: 112 ns per loop

In [53]: type(reversed(ua))
Out[53]: reversed

In [54]: len(letters)
Out[54]: 53

In [55]: %timeit reversed(letters)
10000000 loops, best of 3: 112 ns per loop

In [56]: reversed?
Type:       type
String Form:<type 'reversed'>
Namespace:  Python builtin
Docstring:
reversed(sequence) -> reverse iterator over values of the sequence

Return a reverse iterator

In [57]: l = [1,2,3]

In [58]: b = reversed(l)

In [59]: l[0] = 5

In [60]: list(b)
Out[60]: [3, 2, 5]

lsjfdjoijvtghu 2014-08-29
  • 打赏
  • 举报
回复
引用 11 楼 wn0112 的回复:
[::-1] 差距太小,请再换更大数据测试
In [1]: %timeit u'含敏感词组长字符串'[::-1
]
1000000 loops, best of 3: 1.53 us per loop
In [6]: %timeit u'含敏感词组长字符串'[::-1
1000000 loops, best of 3: 1.49 us per loop
[-1::-1]
In [2]: %timeit u'含敏感词组长字符串'[-1::
1000000 loops, best of 3: 1.48 us per loop
In [5]: %timeit u'含敏感词组长字符串'[-1::
-1]
1000000 loops, best of 3: 1.49 us per loop
reversed()
In [3]: %timeit reversed(u'含敏感词组长字符串')
1000000 loops, best of 3: 321 ns per loop
In [4]: %timeit reversed(u'含敏感词组长字符串')
1000000 loops, best of 3: 322 ns per loop
一下子暴露了破电脑性能,不妙,不妙
手无护鸡之力 2014-08-29
  • 打赏
  • 举报
回复
差距太小,请再换更大数据测试
lsjfdjoijvtghu 2014-08-29
  • 打赏
  • 举报
回复
引用 6 楼 openXMPP 的回复:
import time aString = "this is a testing str, let us check what will happen" start = time.time() for _ in xrange(1000*10000): aString[-1::-1] print 'take ' + str(time.time() - start) start = time.time() for _ in xrange(1000*10000): aString[::-1] print 'take ' + str(time.time() - start) 跑了几次 [-1::-1] 比 [::-1]略快 reversed最慢
不,我的结果正好相反
In [16]: %timeit 'woshiyitiaozifuchuan'[::-1]
1000000 loops, best of 3: 242 ns per loop

In [17]: %timeit 'woshiyitiaozifuchuan'[-1::-1]
1000000 loops, best of 3: 246 ns per loop

In [18]: %timeit reversed('woshiyitiaozifuchuan')
10000000 loops, best of 3: 173 ns per loop
baidu_20119467 2014-08-28
  • 打赏
  • 举报
回复
引用 6 楼 openXMPP 的回复:
import time aString = "this is a testing str, let us check what will happen" start = time.time() for _ in xrange(1000*10000): aString[-1::-1] print 'take ' + str(time.time() - start) start = time.time() for _ in xrange(1000*10000): aString[::-1] print 'take ' + str(time.time() - start) 跑了几次 [-1::-1] 比 [::-1]略快 reversed最慢
不明觉厉,我去研究研究[]里面的 : 和 -1都是干啥的
whoho 2014-08-28
  • 打赏
  • 举报
回复
引用 6 楼 openXMPP 的回复:
import time aString = "this is a testing str, let us check what will happen" start = time.time() for _ in xrange(1000*10000): aString[-1::-1] print 'take ' + str(time.time() - start) start = time.time() for _ in xrange(1000*10000): aString[::-1] print 'take ' + str(time.time() - start) 跑了几次 [-1::-1] 比 [::-1]略快 reversed最慢
感谢兄台的测试,呵呵
乔巴好萌 2014-08-25
  • 打赏
  • 举报
回复
可以 print type(a) 看看a到底是什么类型 应该是字符串类型
乔巴好萌 2014-08-25
  • 打赏
  • 举报
回复
import time aString = "this is a testing str, let us check what will happen" start = time.time() for _ in xrange(1000*10000): aString[-1::-1] print 'take ' + str(time.time() - start) start = time.time() for _ in xrange(1000*10000): aString[::-1] print 'take ' + str(time.time() - start) 跑了几次 [-1::-1] 比 [::-1]略快 reversed最慢
whoho 2014-08-25
  • 打赏
  • 举报
回复
引用 4 楼 u013171165 的回复:
其实就是迭代器
python串不可变,C串可变, 如果不需要生成新副本,在源串上直接进行逆转的话,C的算法可以更高效(当然看起来比python稍长一点点而已)
The_Third_Wave 2014-08-25
  • 打赏
  • 举报
回复
引用 3 楼 whoho 的回复:
[quote=引用 1 楼 wy6zxml 的回复:] 用一个for 循环,逆向遍历字符串,并append给另外一个字符串(起始为''空串) 这个是C语言的思维吧
这是基本思维,不局限于C[/quote]其实就是迭代器
whoho 2014-08-25
  • 打赏
  • 举报
回复
引用 1 楼 wy6zxml 的回复:
用一个for 循环,逆向遍历字符串,并append给另外一个字符串(起始为''空串) 这个是C语言的思维吧
这是基本思维,不局限于C
The_Third_Wave 2014-08-25
  • 打赏
  • 举报
回复
s[::-1]
即可。
wy6zxml 2014-08-25
  • 打赏
  • 举报
回复
用一个for 循环,逆向遍历字符串,并append给另外一个字符串(起始为''空串) 这个是C语言的思维吧

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧