s="I love you"
如何获得
"I evol uoy"
?
我试过了...
words=s.split()
for x in words:
c=list(x)
c.reverse()
" ".join(c)
我得到...
'I'
'evol'
'uoy'
我再次尝试...
words=s.split()
s1=[]
for x in words:
c=list(x)
c.reverse()
for y in c:
s1.append(y)
现在
s1
是:
['I', 'e', 'v', 'o', 'l', 'u', 'o', 'y']
但是单词之间没有空格。
以下是解决第一个解决方案的方法:
s = "I love you"
words = s.split()
def reverse_word(x):
c = list(x)
c.reverse()
return "".join(c)
result = " ".join(reverse_word(w) for w in words)
print(result)
需要解决的重要问题是:
" ".join(c)
而不在某处使用它是没有帮助的。 c
是 x
的副本,反转它不会改变 x
。" ".join(c)
都是错误的,因为你不希望字母之间有空格,所以现在是"".join(c)
。空格被添加到实际的反转句子中。第二个:
s1 = []
for x in words:
new_word = []
c = list(x)
c.reverse()
for y in c:
new_word.append(y)
s1.append("".join(new_word))
result = " ".join(s1)
这里的重要区别是,您需要每个单词(由字母组成)以及整个句子(由单词组成)的列表,因为正如您所看到的,两个单词的单个列表都不起作用。我将其与您的代码保持相似,但
new_word
实际上是多余的,因为它只是 c
的精确副本。所以可以简化如下:
s1 = []
for x in words:
c = list(x)
c.reverse()
s1.append("".join(c))
result = " ".join(s1)
这是一种极其常见的模式:创建一个空列表,在 for 循环的每次迭代中向其中添加一些元素,然后保留最终结果。这种情况很常见,Python 有一种特殊的语法,称为列表推导式:
def reverse_word(x):
c = list(x)
c.reverse()
return "".join(c)
s1 = [reverse_word(word) for word in words]
这是更优雅、Pythonic 的方式。事实上,你现在会注意到上面的第一段代码几乎就是这样,除了我立即使用
s1
甚至没有命名它,并且没有方括号,因为现在它是一个生成器理解和一个很好的小功能Python 的语法意味着只有括号才有效,因为 join
只接受一个参数。不过现在我们已经深入了,不用太担心。
最后,可以简单地使用Python的切片表示法将
reverse_word(word)
替换为word[s::-1]
,一切都可以一步完成,这就是AKS给出的解决方案。
将字符串拆分为单词,反转每个单词,然后将它们连接起来。
' '.join(i[::-1] for i in s.split())