编写一个程序,该程序接收一个字符串,并将其中存在的所有元音移到开头。
我尝试将元音一个一地排序并在旅途中将其取出并分别保存两个弦,然后最后我将其加入
s = "You love Python!"
vowels = "aeiou"
s1= ""
for l in range(0,len(s)):
if s[l] in vowels:
s1 = s1+s[l]
s2 = s.replace(s[l],"")
print(s1+s2)
输出:
ouoeoYu lve Pythn!
但是在输出中,第二个单词“ e”未排序。有什么错误吗?
答案 0 :(得分:1)
问题:
您的代码无法正常工作的原因是,您有时使用s
,有时甚至使用s2
。 s.replace(s[l],"")
对s
无任何作用-因此,每次使用s2
时,s
都会替换成一个元音,而其他元音将被视为{{ 1}}。
最后一个被替换的元音为s
-因此o
变为:s2
-Yu lve Pythn!
和u
仍在其中。
您的固定代码:
e
优化:
请勿按索引进行迭代,而应直接对字符串的字符进行迭代。如果从字符串中收集内容,请避免产生更多的字符串,而应使用列表。字符串是不可变的,每次您修改字符串都是新的。
次优: 您可以使用列表推导将字符分成两个列表,将两个列表组合在一起,然后将它们重新连接成字符串:
s = "You love Python!"
vowels = "aeiou"
s1 = ""
for c in s:
if c in vowels:
s1 = s1+c # produces new string every time
s = s.replace(c,"") # produces new string every time
print(s1+s) # ouoeoY lv Pythn!
输出:
s = "You love Python!"
s1 = [x for x in s if x.lower() in "aeiou"] # gets vowels, order and capitalization is kept
s2 = [x for x in s if x.lower() not in "aeiou"] # gets all other characters
s3 = ''.join(s1+s2) # adds lists back together and makes it a continiois string
print(s1)
print(s2)
print(s3)
缺点:您必须遍历整个字符串两次。一个简单的for循环可以一次完成:
['o', 'u', 'o', 'e', 'o']
['Y', ' ', 'l', 'v', ' ', 'P', 'y', 't', 'h', 'n', '!']
ouoeoY lv Pythn!
输出相同。
Doku: