2011-10-08 65 views
1

可能重複:
Reverse the ordering of words in a string如何使用python(手動)反轉字符串中的單詞?

我知道有一些蟒蛇已經提供了這種方法,但我想知道這些方法是如何工作的,當你只擁有基礎要使用的列表數據結構。如果我有一個字符串hello world,並且我想創建一個新的字符串world hello,我會怎麼想?

然後,如果我可以用一個新的列表來做它,我將如何避免做一個新的列表,並做到這一點?

+1

[This SO question](http:// stackoverflow。com/questions/1009160/reverse-the-ordering-in-a-string)有你的答案和一些Python代碼 –

+1

你永遠不能做到這一點,因爲字符串是不可變的 – JBernardo

+0

@JBernardo:可能他爲什麼要問爲'數組'。 –

回答

4

原來的答案

from array import array 

def reverse_array(letters, first=0, last=None): 
    "reverses the letters in an array in-place" 
    if last is None: 
     last = len(letters) 
    last -= 1 
    while first < last: 
     letters[first], letters[last] = letters[last], letters[first] 
     first += 1 
     last -= 1 

def reverse_words(string): 
    "reverses the words in a string using an array" 
    words = array('c', string) 
    reverse_array(words, first=0, last=len(words)) 
    first = last = 0 
    while first < len(words) and last < len(words): 
     if words[last] != ' ': 
      last += 1 
      continue 
     reverse_array(words, first, last) 
     last += 1 
     first = last 
    if first < last: 
     reverse_array(words, first, last=len(words)) 
    return words.tostring() 

使用list答案來匹配更新問題

def reverse_list(letters, first=0, last=None): 
    "reverses the elements of a list in-place" 
    if last is None: 
     last = len(letters) 
    last -= 1 
    while first < last: 
     letters[first], letters[last] = letters[last], letters[first] 
     first += 1 
     last -= 1 

def reverse_words(string): 
    """reverses the words in a string using a list, with each character 
    as a list element""" 
    characters = list(string) 
    reverse_list(characters) 
    first = last = 0 
    while first < len(characters) and last < len(characters): 
     if characters[last] != ' ': 
      last += 1 
      continue 
     reverse_list(characters, first, last) 
     last += 1 
     first = last 
    if first < last: 
     reverse_list(characters, first, last=len(characters)) 
    return ''.join(characters) 

除了重命名,唯一的利益變化是最後一行。

+0

'words = array('c',string)'做什麼? – locoboy

+0

@ cfarm54:它創建一個'array'對象,該對象包含'string'中的字符類型。查看[docs](http://docs.python.org/library/array.html?#module-array)。 –

+0

所以現在這不適合我。如果'string =「hello world」,那麼'len(words)'是11. – locoboy

1
str = "hello world" 
" ".join(str.split()[::-1]) 
+0

你能解釋一下這裏的邏輯嗎?另外,正如問題中所指出的那樣,我試圖理解使用數組來做這件事的基礎知識。含義以'str ='hello world'開頭,然後創建一個數組並反轉這些單詞。 – locoboy

+0

該字符串被拆分爲具有內置函數的單詞。使用'[ - - 1]'片段反轉分裂列表,按照您詢問的其他問題和鏈接副本中的解釋。然後將相反的單詞列表與空格連接在一起。請注意單詞'list'。在Python中,一個數組是非常不同的。 –

13

Split the string,使reverse iterator然後join零件回來。

' '.join(reversed(my_string.split())) 

如果你所關心的多個空格,改變split()split(' ')


按照要求,我從CPython的源代碼的最古老的可下載版本發佈分裂的實現(通過GVR自己:Link

def split(s,whitespace=' \n\t'): 
    res = [] 
    i, n = 0, len(s) 
    while i < n: 
     while i < n and s[i] in whitespace: 
      i = i+1 
     if i == n: 
      break 
     j = i 
     while j < n and s[j] not in whitespace: 
      j = j+1 
     res.append(s[i:j]) 
     i = j 
    return res 

我覺得現在有這樣做(也許GROUPBY的更Python的方式)和t他原來的源有一個bug(if i = n:,corrrected到==

+0

如果我不得不將它編程出來,又會如何逆轉工作? – locoboy

+0

@cfarm反向返回一個迭代器。你將不得不將容器從它的大小循環到零,['yield'](http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained/231855#231855) – JBernardo

+0

做分工嗎?你能寫出分裂和逆轉的代碼嗎? – locoboy

3

你有一個字符串:

str = "A long string to test this algorithm" 

分割字符串(在字邊界 - 無參數split):

splitted = str.split() 

反轉獲得的陣列 - 使用範圍或函數

reversed = splitted[::-1] 

連接所有帶空格的單詞 - 也稱爲加入。現在

result = " ".join(reversed) 

,你並不需要那麼多的臨時工,它們合併成一個行給出:

result = " ".join(str.split()[::-1]) 
+0

我不明白爲什麼這是downvoted。它通過OP想要澄清的現有答案的步驟,並達到相同的正確結果。 –

+1

@KarlKnechtel:他們都是不錯的答案,除非不回答問題 - 他們都沒有使用數組。 –