给出一个文本字符串,创建并返回一个新的字符串,该字符串是通过查找其所有元音(对于 简单性,在此问题中的元音是字符串“ 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”
答案 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