Python 字符串中的反向元音

Python 字符串中的反向元音,python,Python,我是你们世界的初学者。我见过很多人试图用奇特的内置函数来回答这个问题,并且已经找到了如何解决这个问题的答案一千次了,但没有一次是用两个for循环的方法 我希望代码只在字符串中找到元音时反转元音,使用two for循环方法 我编写了一些似乎不起作用的代码,我不太明白为什么 for x in newWord: for y in vowels: if x == y: newWord[x] = newWord[7] 印刷新词 元音是元音的列表,新词也是元音的列表 这段代码目前不

我是你们世界的初学者。我见过很多人试图用奇特的内置函数来回答这个问题,并且已经找到了如何解决这个问题的答案一千次了,但没有一次是用两个for循环的方法

我希望代码只在字符串中找到元音时反转元音,使用two for循环方法

我编写了一些似乎不起作用的代码,我不太明白为什么

for x in newWord:
for y in vowels:
    if x == y:
        newWord[x] = newWord[7]
印刷新词

元音是元音的列表,新词也是元音的列表


这段代码目前不起作用,就像大多数其他尝试过双for循环方法的人一样。感谢您的帮助。谢谢

这段代码不用使用任何“奇特的内置函数”就能解决您的问题

def(word):
元音=“aeiou”
字符串=列表(word)
i=0
j=len(word)-1
而i
大致上,您希望使用的方法是对字符列表进行两次遍历。在第一步中,你会找到每个元音的索引,建立一个要做的工作列表(要交换的元音的位置)

然后,通过匹配第一个和最后一个项目来准备工作列表,直到工作列表中剩下的项目少于两个。(一个奇数的元音意味着中间的一个不需要与任何东西交换)。 现在您只需迭代工作列表、元组/索引对。对于每对,将第一个偏移处的字符与另一个偏移处的字符交换。完成了

(这是假设您希望就地转换列表。如果不希望,则可以从副本开始:
new\u word=word[:]
,或者可以迭代
enumerate(word)
,并有条件地在每个点追加字符(如果偏移量不在工作列表中)…或追加偏移量字符)(如果此索引与列表中的某个索引相匹配)。在后一种情况下,您可以将工作列表改为词典)

下面是要演示的代码:

def rev_vowels(word):
    word = list(word)
    results = word[:]
    vowel_locations = [index for index, char in enumerate(word) if char in 'aeiou']
    work = zip(vowel_locations[:int(len(vowel_locations)/2)], reversed(vowel_locations))
    for left, right in work:
        results[left], results[right] = word[right], word[left]
    return results
这确实使用了列表理解、zip()和reversed()内置函数、zip()的第一个参数的复杂片段,以及用于交换变量的Python元组打包习惯用法。因此,您可能必须用更详细的结构来替换这些结构,以满足“无花哨的内置函数”约束

然而,从根本上说,列表理解只是for循环的语法糖分。因此,总体而言,这演示了在数据上使用两个for循环的方法。当我返回数据副本作为我的结果时,代码将不使用它。(这就是为什么我在第七行使用元组打包习惯用法。)(就在返回语句之前)

如果在面试中问这个问题,我有理由相信这是一个相当好的答案。您可以轻松地分解如何实现zip,如何将列表理解扩展为传统的for套件(block),并且在返回副本而不是对数据执行就地转换时,交换行可以是两个单独的赋值


这些变量名非常冗长。但这是为了让意图特别清楚。

除了缩进,还有什么不适合您的代码?为什么是
newWord[7]中的7
单词的第8个字符不一定是元音。字符串是不可变的,因此您无法更改字符串。您必须扫描一个字符串并创建另一个字符串,方法是更改元音并复制所有其他内容。您的问题的正确答案不明显;请提供一些答案。这不是交换字符,而是打印g一次又一次地查看新词列表。我用len(新词)来决定在哪里插入字符,这是我获取新词[7]的方式,在列表的末尾插入元音。@9000我的字符串或“单词”实际上是一个字符列表。例如“foobar”=[“f”、“o”、“o”、“b”、“a”、“r”]什么是反向元音?嗨,Vinicius,是的,我找到了这段代码,虽然它实现了最终目标。我没有接受它,因为我想首先使用两个循环比较将元音附加到列表的末尾。但是使用两个嵌套的循环将导致时间限制超出错误。我在LeetDeawesom中尝试了这种方法e、 谢谢,我试试看。
def rev_vowels(word):
    word = list(word)
    results = word[:]
    vowel_locations = [index for index, char in enumerate(word) if char in 'aeiou']
    work = zip(vowel_locations[:int(len(vowel_locations)/2)], reversed(vowel_locations))
    for left, right in work:
        results[left], results[right] = word[right], word[left]
    return results