我知道python已经为此提供了一些方法,但是我试图理解当你只使用列表数据结构时这些方法如何工作的基础知识。如果我有一个字符串hello world
并且我想创建一个新字符串world hello
,我该怎么想这个?
然后,如果我可以使用新列表,我将如何避免制作新列表并进行到位?
答案 0 :(得分:14)
Split the string,制作一个reverse iterator然后join
部分。
' '.join(reversed(my_string.split()))
如果您担心多个空格,请将split()
更改为split(' ')
根据要求,我发布了一个split的实现(由GvR自己从最古老的可下载版本的CPython源代码中发布: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
我认为现在有更多的pythonic方式(也许是groupby),原始来源有一个bug(if i = n:
,更改为==
)
答案 1 :(得分:7)
原始答案
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)
除了重命名之外,唯一感兴趣的变化是最后一行。
答案 2 :(得分:5)
你有一个字符串:
str = "A long string to test this algorithm"
拆分字符串(在字边界 - 没有split
的参数):
splitted = str.split()
反转获得的数组 - 使用范围或函数
reversed = splitted[::-1]
将所有单词与中间的空格连接起来 - 也称为连接。
result = " ".join(reversed)
现在,你不需要那么多的临时工,将它们组合成一行给出:
result = " ".join(str.split()[::-1])
答案 3 :(得分:1)
str = "hello world"
" ".join(str.split()[::-1])