【发布时间】:2013-07-26 00:06:45
【问题描述】:
我正在尝试输出字符串的旋转版本。我取了一个字符串z="string",并从中创建了一个双端队列y=collections.deque(z) (deque(['S','t','r','i','n','g']),并使用旋转方法对其进行了旋转。如何将我旋转回的双端队列对象“转换”回字符串?
【问题讨论】:
标签: python collections rotation deque
我正在尝试输出字符串的旋转版本。我取了一个字符串z="string",并从中创建了一个双端队列y=collections.deque(z) (deque(['S','t','r','i','n','g']),并使用旋转方法对其进行了旋转。如何将我旋转回的双端队列对象“转换”回字符串?
【问题讨论】:
标签: python collections rotation deque
你可以使用string join method:
''.join(y)
In [44]: import collections
In [45]: z = "string"
In [46]: y = collections.deque(z)
In [47]: ''.join(y)
Out[47]: 'string'
【讨论】:
只需连接字符串中的字符:
''.join(y)
【讨论】:
只需使用str.join() 方法:
>>> y.rotate(3)
>>> y
deque(['i', 'n', 'g', 's', 't', 'r'])
>>>
>>> ''.join(y)
'ingstr'
【讨论】:
使用''.join(y) 应该可以解决问题。
【讨论】:
一个好的方法是在字符串上使用join 方法。
''.join(y)
【讨论】:
你可以使用join():
''.join(y)
【讨论】:
回答您的问题:由于双端队列是sequence,您通常可以使用str.join 从该集合的有序元素中形成一个字符串。 str.join 在任何 Python iterable 上更广泛地工作,以将元素一个接一个地连接在一起形成一个字符串。
但是,建议,而不是双端队列和旋转和连接,您还可以在字符串本身上连接切片以形成一个新字符串:
>>> z="string"
>>> rot=3
>>> z[rot:]+z[:rot]
'ingstr'
这两种方式都适用:
>>> rz=z[rot:]+z[:rot]
>>> rz
'ingstr'
>>> rz[-rot:]+rz[:-rot]
'string'
除了更容易阅读(恕我直言)它还快了很多:
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))
打印:
True
f1: 0.32 secs
f2: 5.02 secs
faster is 1474.49% faster.
【讨论】: