python - 不使用reverse()或[:: - 1]反轉字符串?



15 Answers

另一種選擇:

from collections import deque
def reverse(iterable):
    d = deque()
    d.extendleft(iterable)
    return ''.join(d)
python string function for-loop reverse

我遇到了一個奇怪的Codecademy練習,它需要一個函數,它將一個字符串作為輸入並以相反的順序返回它。 唯一的問題是你不能在, [::-1]上使用反向方法或常見答案。

顯然在編程的現實世界中,人們最有可能採用擴展切片方法,甚至使用reversed函數,但也許有些情況下這不起作用?

我將以問答方式提出以下解決方案,以防將來對人們有所幫助。




編輯

最近關於這個問題的活動使我回顧並使用發電機將我的解決方案改為快速單線:

rev = ''.join([text[len(text) - count] for count in xrange(1,len(text)+1)])

雖然這裡有一些更好的答案,比如範圍或xrange函數中的負步驟。 以下是我原來的解決方案:

這是我的解決方案,我將逐步解釋

def reverse(text):

    lst = []
    count = 1

    for i in range(0,len(text)):

        lst.append(text[len(text)-count])
        count += 1

    lst = ''.join(lst)
    return lst

print reverse('hello')

首先,我們必須將參數傳遞給函數,在本例中為text

接下來,我設置一個空列表,名為lst以便稍後使用。 (我實際上不知道我需要列表,直到我進入for循環,你會明白為什麼它在一秒鐘內是必要的。)

一旦進入for循環, count變量就有意義了

那麼讓我們來看看我們要完成的基本版本:

有意義的是,將最後一個字符附加到列表將開始相反的順序。 例如:

>>lst = []
>>word = 'foo'
>>lst.append(word[2])
>>print lst
['o']

但是為了繼續顛倒順序,我們需要添加word[1]然後word[0]

>>lst.append(word[2])
>>lst.append(word[1])
>>lst.append(word[0])
>>print lst
['o','o','f']

這很好,我們現在有一個列表,它以相反的順序包含我們的原始單詞,並且可以使用.join()將其轉換回字符串。 但是有一個問題。 這適用於單詞foo,它甚至適用於任何長度為3個字符的單詞。 但是一個包含5個字符的單詞怎麼樣? 還是10個字符? 現在它不起作用。 如果有一種方法可以動態更改我們附加的索引,以便以相反的順序返回任何單詞,該怎麼辦?

輸入for循環。

for i in range(0,len(text)):

    lst.append(text[len(text)-count])
    count += 1

首先,有必要in range()而不是in ,因為我們需要遍歷單詞中的字符,但我們還需要提取單詞的索引值以便我們更改順序。

我們的for循環體的第一部分應該看起來很熟悉。 它非常相似

>>lst.append(word[..index..])

事實上,它的基本概念是完全相同的:

>>lst.append(text[..index..])

那麼中間的所有東西都在做什麼呢?

好吧,我們需要先將最後一個字母的索引附加到列表中,這是單詞text的長度-1。 從現在開始,我們將其稱為l(t)-1

>>lst.append(text[len(text)-1])

只有那個單詞總是會得到我們單詞的最後一個字母,並將其附加到lst ,無論單詞的長度如何。 但是現在我們有了最後一個字母,即l(t) - 1,我們需要倒數第二個字母,即l(t) - 2,依此類推,直到沒有更多字符附加到列表中。 還記得上面的count變量嗎? 這將派上用場。 通過使用for循環,我們可以在每次迭代時將count的值遞增1,這樣我們減去的值就會增加,直到for循環迭代整個單詞:

>>for i in range(0,len(text)):
..        
..      lst.append(text[len(text)-count])
..      count += 1

現在我們已經掌握了我們的功能,讓我們看看到目前為止我們擁有的東西:

def reverse(text):

    lst = []
    count = 1

    for i in range(0,len(text)):

        lst.append(text[len(text)-count])
        count += 1

我們差不多完成了! 現在,如果我們用“hello”這個詞調用我們的函數,我們會得到一個如下所示的列表:

['O','L','L','E','H']

我們不想要一個列表,我們想要一個字符串。 我們可以使用.join

def reverse(text):

    lst = []
    count = 1

    for i in range(0,len(text)):

        lst.append(text[len(text)-count])
        count += 1

    lst = ''.join(lst) # join the letters together without a space
    return lst

就是這樣。 如果我們在reverse()上調用'hello'這個詞,我們就會得到:

>>print reverse('hello')
olleh

顯然,這是在現實生活中需要的代碼。 使用反轉函數或擴展切片將是完成此任務的最佳方法,但是可能存在一些不起作用的實例,並且您需要這樣做。 無論哪種方式,我想我會分享給任何有興趣的人。

如果你們有任何其他想法,我很樂意聽到他們!




我用過這個:

def reverse(text):
s=""
l=len(text)
for i in range(l):
    s+=text[l-1-i]
return s



這是一個非常有趣的問題,我想提供一個簡單的單線答案:

>>> S='abcdefg'
>>> ''.join(item[1] for item in sorted(enumerate(S), reverse=True))
'gfedcba'

簡要說明:

enumerate()返回[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g')] 。 指數和價值觀。 要反轉這些值,只需按sorted()反向排序即可。 最後,把它放回到一個str




reduce(lambda x, y : y + x, "hello world")



我剛剛在代碼學院解決了這個問題,並且正在檢查我的答案並查看了這個列表。 所以對python的理解非常有限,我剛剛做了這個並且它接合工作了。

def reverse(s):
    i = len(s) - 1
    sNew = ''
    while  i >= 0:
        sNew = sNew + str(s[i])
        i = i -1
    return sNew



Blender的答案很可愛,但對於很長的字符串,它會導致一個驚人的RuntimeError: maximum recursion depth exceeded 。 有人可能會將相同的代碼重構為while循環,因為人們經常必須在python中進行遞歸。 由於時間和內存問題顯然仍然很糟糕,但至少不會出錯。

def reverse(text):
    answer = ""
    while text:
        answer = text[0] + answer
        text = text[1:]
    return answer



這是使用while循環執行此操作的方法:

def reverse(s):
    t = -1
    s2 = ''
    while abs(t) < len(s) + 1: 
        s2 = s2 + s[t]
        t  = t - 1
    return s2



def reverse(text):
    a=""
    l=len(text)
    while(l>=1):
        a+=text[l-1]
        l-=1
    return a

我只是將字符串a連接到文本的最高索引(每個循環繼續遞減1)。




您可以簡單地從最後一個字符開始反向迭代字符串。 使用python,您可以使用列表推導以相反的順序構造字符列表,然後將它們連接起來以獲得單行中的反轉字符串:

def reverse(s):
  return "".join([s[-i-1] for i in xrange(len(s))])

如果你不被允許甚至使用否定索引你應該用s[len(s)-i-1]替換s[-i-1] s[len(s)-i-1]




def reverseThatString(theString):
    reversedString = ""
    lenOfString = len(theString)
    for i,j in enumerate(theString):
        lenOfString -= 1
        reversedString += theString[lenOfString]
    return reversedString



這是我的貢獻:

def rev(test):  
    test = list(test)
    i = len(test)-1
    result = []

    print test
    while i >= 0:
        result.append(test.pop(i))
        i -= 1
    return "".join(result)



這是一個使用列表作為堆棧:

def reverse(s):
  rev = [_t for _t in s]
  t = ''
  while len(rev) != 0:
    t+=rev.pop()
  return t



不是很聰明,但很棘手的解決方案

def reverse(t):
    for j in range(len(t) // 2):
        t = t[:j] + t[- j - 1] + t[j + 1:- j - 1] + t[j] + t[len(t) - j:]
    return t



我可以在不使用任何內置函數的情況下思考的方式:

a = 'word'
count = 0
for letter in a:
    count += 1

b = ''
for letter in a:
    b += a[count-1]
    count -= 1

如果你打印b:

print b
drow



Related