2017-07-13 31 views
4

我很困惑Python的insert()函數是如何工作的。我試圖扭轉一個字符串,我想我可以通過簡單地創建一個列表來存儲原始字符串的字符以相反的順序。這裏是我的代碼: -我可以在Python的空列表上使用insert()嗎?

def reverse(text): 
    rev = [] 
    l = len(text) - 1 
    for c in text: 
     rev.insert(l, c) 
     l -= 1 
    return rev 

print reverse("Hello") 

然而,輸出我得到的是['o', 'H', 'l', 'e', 'l'],這顯然是錯誤的。 任何幫助,將不勝感激。我申請的邏輯有錯嗎?

回答

1

您需要在開頭插入:l.insert(0, ...)

In [85]: l = list('Hello') 

In [86]: rev = [] 
    ...: for c in l: 
    ...:  rev.insert(0, c) 
    ...:  

In [87]: rev 
Out[87]: ['o', 'l', 'l', 'e', 'H'] 
+0

嘿。這很好。謝謝! – Vaibhav

+0

@Vaibhav很高興幫助:) –

+0

@Vaibhav如果這個答案對你有幫助,請考慮接受它,以便其他用戶知道你的問題有答案。 – Ajax1234

1

在python中,列表是零索引。所以當你做insert(1,c)時,你實際上是插入列表中的SECOND位置。 要插入列表的開頭,請使用insert(0,c)

+0

append將始終將該元素添加到列表的末尾。由於我想扭轉我的絃樂,我實際上想從另一個方向走,從最終指數到第0位。 – Vaibhav

+0

然後'insert(0,c)'應該可以工作。 – frozen

+0

這就是[:: - 1](反轉列表)派上用場的地方。通過反轉列表循環將得到期望的輸出與插入(0,c)或append()。 –

1

你所尋找的是一個deque

from collections import deque 

s = "Hello" 

d = deque() #create a deque object 

for i in s: 
    d.appendleft(i) 


print(''.join(d)) 

輸出:

olleH 

一個deque給你創造兩端可變列表的選項。方法appendleft()insert(0, value)相同。

2

,你可以在python一個空表上使用insert()。這直接導致你的代碼的問題:

rev = [] 
rev.insert(3, 'a') # ['a'] 

如果指數大於列表的長度越大,該項目將只被追加。在你的代碼中,第一個插入是位置5處的'H';但這隻會導致rev = ['H']。這是'H'錯誤的位置!

的補救措施也只是在位置0插入:

def reverse(text): 
    rev = [] 
    for c in text: 
     rev.insert(0, c) 
    return rev 

(以防萬一:做最簡單的方法是,在巨蟒:'Hello'[::-1]

-1
def reverse(text): 
    revText = text[::-1] 
    return list(revText) 

print reverse("Hello") 

結果

['o', 'l', 'l', 'e', 'H'] 
+0

爲什麼downvoted,你的預期輸出是什麼? – uingtea

+0

另一種實現是好的,但它不回答「如何使用insert()'?」 – phd

0

您可以試試這種方式:

def reverse(text): 
    rev = [] 
    for c in text: 
    rev.insert(0, c) 
    return rev 

print reverse("Hello") 
1

雖然其他人已經告訴你如何解決你的方法,我會解釋你的前一個錯誤。

您的方法存在的問題是您的列表會更改每次迭代。所以你的元素的插入位置是相對於列表的當前長度。這是通過你的循環,基本上是做一個步:

>>> rev = [] 
>>> l = len('Hello') - 1 
>>> l 
4 
>>> # first iteration 
>>> rev.insert(l, 'H') 
>>> rev 
['H'] 
>>> l -= 1 
>>> l 
3 
>>> # second iteration 
>>> rev.insert(l, 'e') 
>>> rev 
['H', 'e'] 
>>> l -= 1 
>>> l 
2 
>>> # third iteration 
>>> rev.insert(l, 'l') 
>>> rev 
['H', 'e', 'l'] 
>>> l -= 1 
>>> l 
1 
>>> # fourth iteration 
>>> rev.insert(l, 'l') 
>>> rev 
['H', 'l', 'e', 'l'] 
>>> l -= 1 
>>> l 
0 
>>> # Fifth iteration 
>>> rev.insert(l, 'o') 
>>> rev 
['o', 'H', 'l', 'e', 'l'] 
>>> l -= 1 
>>> l 
-1 
>>> # end 

正如你可以看到,根據該列表是如何生長您的插入位置的變化。有時insert的行爲類似於append(),其他時候它的行爲可能跟insert()一樣。

您可以通過使您的插入位置0解決此問題。這樣,無論列表如何變化,您總是追加到列表的開頭:

rev.insert(0, c) 
+0

嘿,謝謝!我現在明白了。 :) – Vaibhav

+0

很高興幫助@Vaibhav! –

相關問題