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

时间:2019-05-24 15:54:38

标签: python string algorithm

给出一个文本字符串,创建并返回一个新的字符串,该字符串是通过查找其所有元音(对于 简单性,在此问题中的元音是字符串“ aeiouAEIOU”中的字母,并将它们的字母反转 顺序,同时将所有非元音字符保持原样。 但是,为了使结果看起来更漂亮,每个元音的大小写必须与 原来在同一位置的元音例如,反转“ Ilkka”的元音应 产生“ Alkki”而不是“ alkkI”

如果我不考虑元音最初是否为upperCase的问题,我的代码将起作用。但是,当我考虑到这一点时,我的辅音也开始混乱了

requestify.get('URL').then(function(response) {
  // Get the response body
  var dataBody = response.getBody();
  var lineArray = dataBody.split('\r\n');
  var data = JSON.parse(JSON.stringify(lineArray));

  for(var s = 0; s < data.length; s++) {
    var rows = data[s];
    console.log(rows)
  }
});

预期结果:reverse_vowels(“ HEllo world”)=“ HOllo werld” 实际结果:“ HOWLO LERLD”

5 个答案:

答案 0 :(得分:0)

使用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'

答案 1 :(得分:0)

在更新代码之前,您是否制作了任何形式的逻辑图(例如流程图)?您已经将自己的逻辑束之高阁。

最简单的观察结果在这里:

        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

我强烈建议您重新检查逻辑流程。最重要的是,当您只需要考虑三种不同的情况时,可以在六个位置更新指针。如果尚未教过如何制作流程图或其他逻辑图,则建议您选择一种适合自己的方法并自学。您可以使用此类视觉辅助工具解决许多此类问题。

答案 2 :(得分:0)

这有效:

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

在字符串中获取元音后,使用反向函数,然后将其相应地放回

答案 3 :(得分:0)

这是一个解决方案:

@Autowired
private ApplicationContext context;
private Runnable linesWriterClearer;

@PostConstruct
public void initLinesWriterClearer() throws NoSuchFieldException, IllegalAccessException {
    Object linesWriter = context.getBean("org.springframework.boot.test.autoconfigure.web.servlet.SpringBootMockMvcBuilderCustomizer$DeferredLinesWriter");
    Field linesField = linesWriter.getClass().getDeclaredField("lines");
    linesField.setAccessible(true);
    List<?> lines = (List<?>) linesField.get(linesWriter);
    linesWriterClearer = lines::clear;
}

@Before
public void clearLinesWriter() {
    linesWriterClearer.run();
}

输入:地狱世界
输出:HOllo werld

答案 4 :(得分:0)

正如Corentin所说,在这种情况下,格式化功能会很有用

my_string = "HEllo world"
vouels = list("aeiou")
upper_case_indexes = [i for i, x in enumerate(my_string) if x.isupper()]
print upper_case_indexes
# output: [0, 1]

my_string_lower = my_string.lower()
my_reversed_vouels = [x for x in my_string_lower if x in vouels][::-1]
print my_reversed_vouels
# output: ['o', 'o', 'e']

replaced_vouels_list = map(lambda x: "{}" if x in vouels else x, my_string_lower)
print replaced_vouels_list
# output: ['h', '{}', 'l', 'l', '{}', ' ', 'w', '{}', 'r', 'l', 'd']

replaced_vouels_str = "".join(replaced_vouels_list)
print replaced_vouels_str
# output: h{}ll{} w{}rld

formated_str = replaced_vouels_str.format(*my_reversed_vouels)
print formated_str
# output: hollo werld

uppercase_str = "".join([x.upper() if i in upper_case_indexes else x for i, x in enumerate(list(formated_str))])
print uppercase_str
# output: HOllo werld