Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 反转给定字符串中的元音,考虑大小写_Python_String_Algorithm - Fatal编程技术网

Python 反转给定字符串中的元音,考虑大小写

Python 反转给定字符串中的元音,考虑大小写,python,string,algorithm,Python,String,Algorithm,给定一个文本字符串,创建并返回一个通过查找其所有元音(例如 简单,在这个问题元音中,是字符串“aeiouAEIOU”)中的字母,并颠倒它们的顺序 顺序,同时保持所有非元音字符与原始位置完全相同。 然而,为了使结果看起来更漂亮,每个元音的大小写必须与此相同 元音最初处于同一位置。例如,颠倒“Ilkka”的元音应该 生产“Alkki”而不是“Alkki” 如果我不考虑元音是否为大写,我的代码就可以工作。然而,当我考虑到这一点时,我的辅音也开始混乱起来 def reverse_元音: 元音=集合(列表

给定一个文本字符串,创建并返回一个通过查找其所有元音(例如 简单,在这个问题元音中,是字符串“aeiouAEIOU”)中的字母,并颠倒它们的顺序 顺序,同时保持所有非元音字符与原始位置完全相同。 然而,为了使结果看起来更漂亮,每个元音的大小写必须与此相同 元音最初处于同一位置。例如,颠倒“Ilkka”的元音应该 生产“Alkki”而不是“Alkki”

如果我不考虑元音是否为大写,我的代码就可以工作。然而,当我考虑到这一点时,我的辅音也开始混乱起来

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

谢谢!与我的相比,这是一个多么优雅的解决方案啊,库多斯谢谢!我应该通过做一个逻辑图来解决这个问题。请花点时间来完成介绍之旅。正如它在几个地方所说的,“让别人更容易帮助你。”使用通用变量名的未记录代码不容易理解,特别是插入冗余代码时。下次…:-)