Ste*_*aul 6 python collections rotation deque
我正在尝试输出字符串的旋转版本。我已经取了一个字符串,z="string"并从中创建了一个双端队列y=collections.deque(z) (deque(['S','t','r','i','n','g']),并使用Rotate方法旋转了它。如何“转换”我旋转回双端字符串的双端队列对象?
回答您的问题:由于双端队列是一个序列,因此通常可以使用str.join从该集合的有序元素中形成一个字符串。str.join在任何可迭代地将元素逐个连接在一起的字符串上形成字符串的Python上,它的工作范围更广。
但是,建议(而不是双端队列,旋转和联接),您还可以在字符串本身上连接切片以形成新字符串:
>>> z="string"
>>> rot=3
>>> z[rot:]+z[:rot]
'ingstr'
Run Code Online (Sandbox Code Playgroud)
这两种方法都可以:
>>> rz=z[rot:]+z[:rot]
>>> rz
'ingstr'
>>> rz[-rot:]+rz[:-rot]
'string'
Run Code Online (Sandbox Code Playgroud)
除了更易于阅读(IMHO),事实证明它还快得多:
from __future__ import print_function #same code for Py2 Py3
import timeit
import collections
z='string'*10
def f1(tgt,rot=3):
return tgt[rot:]+tgt[:rot]
def f2(tgt,rot=3):
y=collections.deque(tgt)
y.rotate(rot)
return ''.join(y)
print(f1(z)==f2(z)) # Make sure they produce the same result
t1=timeit.timeit("f1(z)", setup="from __main__ import f1,z")
t2=timeit.timeit("f2(z)", setup="from __main__ import f2,z")
print('f1: {:.2f} secs\nf2: {:.2f} secs\n faster is {:.2f}% faster.\n'.format(
t1,t2,(max(t1,t2)/min(t1,t2)-1)*100.0))
Run Code Online (Sandbox Code Playgroud)
印刷品:
True
f1: 0.32 secs
f2: 5.02 secs
faster is 1474.49% faster.
Run Code Online (Sandbox Code Playgroud)
只需使用str。join()方法:
>>> y.rotate(3)
>>> y
deque(['i', 'n', 'g', 's', 't', 'r'])
>>>
>>> ''.join(y)
'ingstr'
Run Code Online (Sandbox Code Playgroud)