2014-02-20 29 views
4

在這裏,我嘗試使用下面的邏輯來扭轉字符串,扭轉串如何使用列表理解

st = "This is Ok" 
rst = list(st) 
rst.reverse() 
''.join(s for s in rst) 

它工作正常,但是當我嘗試按以下邏輯我得到一個錯誤,

st = "This is Ok" 
''.join(s for s in list(st).reverse()) 

下面是一個錯誤,

----> 1 ''.join(s for s in list(st).reverse()) 

TypeError: 'NoneType' object is not iterable 

請任一項解釋上述過程。

回答

5

list.reverse是一個就地操作,所以它會改變列表並返回None。您應該使用reversed功能,這樣

"".join(reversed(rst)) 

我個人建議使用slicing notation這樣

rst[::-1] 

例如,

rst = "cabbage" 
print "".join(reversed(rst)) # egabbac 
print rst[::-1]    # egabbac 
2

它失敗,因爲lst.reverse()逆轉地方列表並返回None(並且不能遍歷None)。你正在尋找的是(例如)reversed(lst),它創建了一個新的列表,其中lst被顛倒過來。

請注意,如果你想扭轉一個字符串,那麼你可以直接做到這一點(沒有列出):

>>> st = "This is Ok" 
>>> st[::-1] 
"kO si sihT" 
0

你有沒有嘗試呢?

[x for x in a[::-1]] 

[x for x in reversed(a)] 

兩個工作正常,但它使用的效率更高[:: - 1]

min(timeit.repeat(lambda: [x for x in a[::-1]])) 

出[144]:0.7925415520003298

min(timeit.repeat(lambda: [x for x in reversed(a)])) 

出[145]:0.854458618996432