Python 反转给定字符串中的元音,考虑大小写
给定一个文本字符串,创建并返回一个通过查找其所有元音(例如 简单,在这个问题元音中,是字符串“aeiouAEIOU”)中的字母,并颠倒它们的顺序 顺序,同时保持所有非元音字符与原始位置完全相同。 然而,为了使结果看起来更漂亮,每个元音的大小写必须与此相同 元音最初处于同一位置。例如,颠倒“Ilkka”的元音应该 生产“Alkki”而不是“Alkki” 如果我不考虑元音是否为大写,我的代码就可以工作。然而,当我考虑到这一点时,我的辅音也开始混乱起来Python 反转给定字符串中的元音,考虑大小写,python,string,algorithm,Python,String,Algorithm,给定一个文本字符串,创建并返回一个通过查找其所有元音(例如 简单,在这个问题元音中,是字符串“aeiouAEIOU”)中的字母,并颠倒它们的顺序 顺序,同时保持所有非元音字符与原始位置完全相同。 然而,为了使结果看起来更漂亮,每个元音的大小写必须与此相同 元音最初处于同一位置。例如,颠倒“Ilkka”的元音应该 生产“Alkki”而不是“Alkki” 如果我不考虑元音是否为大写,我的代码就可以工作。然而,当我考虑到这一点时,我的辅音也开始混乱起来 def reverse_元音: 元音=集合(列表
def reverse_元音:
元音=集合(列表(“aeiouAEIOU”))
s=列表
ptr_1,ptr_2=0,len(s)-1
当ptr_2>ptr_1时:
如果元音中有s[ptr_1],元音中有s[ptr_2]:
打印(“ptr_1:+str(ptr_1)+”,s[ptr_1]:“+s[ptr_1]+”;ptr_2:+str(ptr_2)+”,s[ptr_2]:”+s[ptr_2])
如果str(s[ptr_1]).isupper()和str(s[ptr_2]).islower():
s[ptr_1],s[ptr_2]=s[ptr_2]。上(),s[ptr_1]。下()
ptr_1+=1
ptr_2-=1
如果str(s[ptr_2]).isupper()和str(s[ptr_1]).islower():
s[ptr_1],s[ptr_2]=s[ptr_2]。下(),s[ptr_1]。上()
ptr_1+=1
ptr_2-=1
s[ptr_1],s[ptr_2]=s[ptr_2],s[ptr_1]
ptr_1+=1
ptr_2-=1
elif s[ptr_1]不是元音:
ptr_1+=1
elif s[ptr_2]不是元音:
ptr_2-=1
其他:
ptr_1+=1
ptr_2-=1
返回“”。加入(个)
预期结果:反向_元音(“HEllo world”)=“HOllo werld”
实际结果:“HOwlo lerld”使用format函数解决练习的有趣方法:
def reverse_vowels(s):
vowels = set(list("aeiouAEIOU"))
s_vowels = []
s_vowels_upper = []
result = ""
for c in s:
if c in vowels:
result += "{}"
s_vowels.append(c)
s_vowels_upper.append(c==c.upper())
else:
result+=c
s_vowels_reversed = [c.upper() if s_vowels_upper[i] else c.lower()
for i,c in enumerate(s_vowels[::-1])]
return result.format(*s_vowels_reversed)
结果:
>>> reverse_vowels("HEllo world")
'HOllo werld'
>>> reverse_vowels("Ilkka")
'Alkki'
在更新代码之前,您是否制作过任何逻辑图(如流程图)?你的逻辑有点纠结 最简单的观察结果如下:
if str(s[ptr_1]).isupper() and str(s[ptr_2]).islower():
s[ptr_1], s[ptr_2] = s[ptr_2].upper(), s[ptr_1].lower()
ptr_1 += 1
ptr_2 -= 1
if str(s[ptr_2]).isupper() and str(s[ptr_1]).islower():
s[ptr_1], s[ptr_2] = s[ptr_2].lower(), s[ptr_1].upper()
ptr_1 += 1
ptr_2 -= 1
s[ptr_1], s[ptr_2] = s[ptr_2], s[ptr_1]
ptr_1 += 1
ptr_2 -= 1
如果元音大小写不同,则交换元音,更新指针,然后再次交换元音,而不考虑大小写。这就是辅音的作用,因为指针已经离开了你识别的元音。简单地将逻辑流程整理成我希望您想要的三种情况:
if str(s[ptr_1]).isupper() and str(s[ptr_2]).islower():
s[ptr_1], s[ptr_2] = s[ptr_2].upper(), s[ptr_1].lower()
ptr_1 += 1
ptr_2 -= 1
elif str(s[ptr_2]).isupper() and str(s[ptr_1]).islower():
s[ptr_1], s[ptr_2] = s[ptr_2].lower(), s[ptr_1].upper()
ptr_1 += 1
ptr_2 -= 1
else:
s[ptr_1], s[ptr_2] = s[ptr_2], s[ptr_1]
ptr_1 += 1
ptr_2 -= 1
输出:
ptr_1: 1 ,s[ptr_1]: E; ptr_2: 7 ,s[ptr_2]: o
HOllo werld
我强烈建议您重新检查您的逻辑流程。最重要的是,当你只有三个不同的情况需要考虑时,你可以在六个地方更新指针。如果你还没有学过如何制作流程图或其他逻辑图,我建议你选择一种适合你的方法并自学。你可以用这种视觉辅助工具来解决这些问题。这很有效:
def reverse_vowels(s):
vowels = list("aeiouAEIOU")
s = list(s)
v = []
for i in range(len(s)) :
if s[i] in vowels :
v.append(s[i])
r = [i for i in reversed(v)]
k = 0
for i in range(len(s)) :
if s[i] in vowels :
if s[i].isupper() :
s[i] = r[k].upper()
else :
s[i] = r[k].lower()
k = k + 1
return ''.join(s)
print(reverse_vowels("HEllo world"))
输出
HOllo werld
在获取字符串中的元音后使用反转函数,然后相应地将它们放回原处
def reverse_元音(单词):
所有的元音=['a','e','i','o','u']
元音=[]
对于word中的字符:
如果所有_元音中都有char.lower():
元音.append(char.lower())
新单词=“”
对于word中的字符:
如果所有_元音中都有char.lower():
元音=元音.pop(-1)
如果char.isupper():
元音=元音。上()
新词+=元音
其他:
新单词+=字符
返回新单词
输入:HEllo world输出:HOllo werld正如Corentin所说,格式函数在这种情况下非常有用
my_string=“你好,世界”
vouels=列表(“aeiou”)
upper_case_index=[i代表i,如果x.isupper(),则枚举中的x(我的字符串)]
打印大写字母索引
#输出:[0,1]
my_string\u lower=my_string.lower()
my_reversed_vouels=[x代表my_字符串中的x\u lower如果x代表vouels][:-1]
打印我的支票
#输出:['o','o','e']
替换的_vouels_list=map(lambda x:“{}”如果x在vouels else x中,则为my_string_lower)
打印替换的发票清单
#输出:['h','{}','l','{}','''w','{}','r','l','d']
已替换的\u vouels\u str=”“.加入(已替换的\u vouels\u列表)
打印替换的\u vouels\u str
#输出:h{}ll{}w{}rld
格式化的\u str=替换的\u vouels\u str.format(*my\u reversed\u vouels)
打印格式化的
#输出:hollo werld
uppercase_str=“”.join([x.upper(),如果i在uppercase_索引中,则x代表i,x在枚举(列表(格式化的_str))]))
打印大写字母
#输出:HOllo werld
谢谢!与我的相比,这是一个多么优雅的解决方案啊,库多斯谢谢!我应该通过做一个逻辑图来解决这个问题。请花点时间来完成介绍之旅。正如它在几个地方所说的,“让别人更容易帮助你。”使用通用变量名的未记录代码不容易理解,特别是插入冗余代码时。下次…:-)