2010-11-19 27 views
2

我正在編寫一個小代碼片段來使用列表附加和彈出來反轉字符串。使用list.pop()轉換列表問題

,我寫的腳本如下:

someStr = raw_input("Enter some string here:") 
strList = [] 
for c in someStr: 
    strList.append(c) 

print strList 

reverseCharList = [] 
for someChar in strList: 
    reverseCharList.append(strList.pop()) 

print reverseCharList 

當我輸入一個字符串ABCD,所返回的輸出是[d,C]。

我知道我在改變我正在迭代的列表,但有人可以解釋爲什麼字符'a'和'b'不顯示在這裏?

謝謝

+0

這是一個很好的練習來學習遞歸! – Chris 2010-11-19 19:52:12

+2

只是爲了確保:你知道'[] .reverse()',對吧? – nmichaels 2010-11-19 19:55:03

+0

@Nathon - 是的。我只是想知道輸出差異的原因。 「 – 2010-11-19 19:57:50

回答

3

如何簡單地反轉字符串。

>>> x = 'abcd' 
>>> x[::-1] 
'dcba' 
>>> 

在你的代碼:

決不變異在其上用迭代列表。它會導致微妙的錯誤。

>>> strList = [1, 2, 3, 4, 5] 
>>> reverseCharList = [] 
>>> for someChar in strList: 
...  print strList 
...  reverseCharList.append(strList.pop()) 
...  print strList 
... 
[1, 2, 3, 4, 5] <-- Iteration 1 
[1, 2, 3, 4] 
[1, 2, 3, 4]  <-- Iteration 2 
[1, 2, 3] 
[1, 2, 3]   <-- Iteration 3 
[1, 2] 

看到以下內容。由於您正在使用迭代器(for .. in ..)。 您可以直接看到迭代器詳細信息以及如何使用迭代器改變列表的內容。

>>> strList = [1, 2, 3, 4, 5] 
>>> k = strList.__iter__() 
>>> k.next() 
1 
>>> k.__length_hint__() <--- Still 4 to go 
4 
>>> strList.pop()   <---- You pop an element 
5 
>>> k.__length_hint__() <----- Now only 3 to go 
3 
>>> 
>>> k.next() 
2 
>>> k.__length_hint__() 
2 
+0

感謝您的替代版本我只是想知道我發佈的代碼段有什麼問題 – 2010-11-19 19:55:56

+1

''.join(顛倒('abcd'))也做同樣的事情,但根據timeit與清單切片運算符大約快了9倍! – Imran 2010-11-19 20:01:39

+0

完美。感謝您的解釋 – 2010-11-19 20:22:12

5
for someChar in strList: 
    reverseCharList.append(strList.pop()) 

是基本上相同:

i = 0 
while i < len(strList): 
    reverseCharList.append(strList.pop()) 
    i += 1 

第一迭代i是0,LEN(strList)是4,並且你彈出+追加 'd'。

第二次迭代我是1,len(strList)是3,並且你彈出+追加'c'。

第三次迭代我是2,len(strList)是2,所以循環條件失敗,你就完成了。

(這是真的與列表,而不是一個局部變量「我」。我已經展示了這種方式爲清楚起見,在一個迭代完成的。)

如果你想操縱你遍歷序列通常使用while循環會更好。例如:

while strList: 
    reverseCharList.append(strList.pop()) 
+0

這是一個很好的解釋。有什麼地方可以查看關於如何使用迭代器在Python中實現for-in構造函數的具體信息? – 2010-11-19 20:08:51

+0

@sc_ray:我已經包含了迭代器對改變序列效果的簡單說明。 – pyfunc 2010-11-19 20:11:04

1

您在彈出時縮短列表。

reverseCharList = [] 
while strList: 
    reverseCharList.append(strList.pop()) 
1

一個簡單的recersive版本:

def reverse(the_list): 
    if not the_list: 
     return [] 
    return [the_list.pop()] + reverse(the_list) 

當然,[].reverse()更快。