2013-07-25 70 views

回答

4

回答你的問題:由於一個deque是sequence,通常可以使用str.join形成從收集的有序元素的字符串。 str.join在任何Python iterable上的工作更廣泛,從逐個連接在一起的元素形成一個字符串。

,但建議,而不是一個deque和旋轉和加入,你也可以連接在字符串本身片,形成一個新的字符串:

>>> 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. 
+0

哇。棒極了!謝謝! –

+0

@StephenPaul:謝謝。如果這是有幫助的,請隨時[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – dawg

+0

在這裏使用slice更快,因爲創建使用deque太多時間。 – Windsooon

2

您可以使用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' 
2

正好連接字符字符串中:

''.join(y) 
4

只需使用str.join()方法:

>>> y.rotate(3) 
>>> y 
deque(['i', 'n', 'g', 's', 't', 'r']) 
>>> 
>>> ''.join(y) 
'ingstr' 
2

使用''.join(y)應該做的伎倆。

1

一個好方法是在字符串上使用join方法。

''.join(y) 
1

您可以使用join()

''.join(y)