2017-07-18 87 views
1

我正在寫一個函數來反轉一個字符串,但直到最後它才完成。我在這裏錯過了什麼嗎?Python:字符串反向中途停止

def reverse_string(str): 
    straight=list(str) 
    reverse=[] 
    for i in straight: 
     reverse.append(straight.pop()) 
    return ''.join(reverse) 

print (reverse_string('Why is it not reversing completely?')) 
+0

感謝@JohnColeman的澄清。我只是好奇爲什麼這個邏輯失敗了。是的,這是一個壞主意;來自網站的代碼挑戰'str',我沒有改變它 – Sri

回答

5

問題是你從原來的元素pop,從而改變噸的長度他列出,所以循環將停止在一半的元素。

這通常是通過創建一個臨時副本解決:在倒車,你可以使用已有的(容易)替代品的情況下

def reverse_string(a_str): 
    straight=list(a_str) 
    reverse=[] 
    for i in straight[:]: # iterate over a shallow copy of "straight" 
     reverse.append(straight.pop()) 
    return ''.join(reverse) 

print(reverse_string('Why is it not reversing completely?')) 
# ?yletelpmoc gnisrever ton ti si yhW 

但是:

切片:

>>> a_str = 'Why is it not reversing completely?' 
>>> a_str[::-1] 
'?yletelpmoc gnisrever ton ti si yhW' 

reversed迭代器:

>>> ''.join(reversed(a_str)) 
'?yletelpmoc gnisrever ton ti si yhW' 
+0

感謝@MSeifert的詳細回覆。爲什麼循環中途停止,具體原因是什麼? – Sri

+1

假設列表在循環前長4個項目。在第一次迭代中,它給出第一個項目,然後你彈出一個項目(新的長度= 3),下一個迭代它給你第二個項目並彈出一個(新的長度= 2),循環將給你的下一個迭代第三項,但因爲列表只有長度2,現在它停在那裏。事實上它將列表減半是因爲在每次迭代中彈出一個元素(從而每次迭代消耗2個項目)。 :) – MSeifert

+1

'直行'比遍歷副本更有意義,因爲考慮到副本的元素無論如何都被完全忽略。只是彈出,直到沒有任何東西離開。 – user2357112

1

在Python中你可以使用步驟迭代扭轉字符串

print('hello'[::-1]) 

將扭轉串

1

還有就是要扭轉一個簡單的方法:

>>> 'my string'[::-1] 
'gnirts ym' 
0

您可以在另一個列表中使用循環從列表的最後一個指數爲零索引,然後append然後join得到扭轉特林。

def reverse_string(str): 
    straight=list(str) 
    print straight 
    reverse=[] 
    for i in range(len(straight)-1,-1,-1): 
     reverse.append(straight[i]) 
    return ''.join(reverse) 


print (reverse_string('Why is it not reversing completely?'))