字符串Python中的反元音

2024-09-28 17:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

for x in newWord:
for y in vowels:
    if x == y:
        newWord[x] = newWord[7]

print newWord

元音是元音的列表,newWord也是一个列表。在

这段代码目前无法正常工作,就像大多数尝试过two-for-loop方法的人一样。感谢任何帮助。谢谢


Tags: 方法函数答案代码inloop列表for
2条回答

这段代码应该可以在不使用任何“花哨的内置函数”的情况下解决您的问题。在

def f(word):
    vowels = "aeiou"
    string = list(word)
    i = 0
    j = len(word)-1

    while i < j:
        if string[i].lower() not in vowels:
            i += 1
        elif string[j].lower() not in vowels:
            j -= 1
        else:
            string[i], string[j] = string[j], string[i]
            i += 1
            j -= 1

    return "".join(string)

大致上,您要使用的方法是对字符列表进行两次遍历。在第一个过程中,你会找到每个元音的索引,建立一个要完成的工作列表(要交换的元音的位置)。在

然后通过匹配第一项和最后一项来准备工作列表,直到工作列表中剩下的项目少于两项。(元音的奇数意味着中间的那个不必与任何东西交换)。在

现在只需迭代工作列表、元组/索引对。交换每个对的第一个偏移量处的字符与另一个偏移量处的字符。完成。在

(这是假设您希望将列表转换到位。如果不是,那么您可以从一个副本开始:new_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循环的方法。当我返回数据的副本作为我的结果时,没有这个代码也可以工作。(这就是为什么我在第七行使用元组打包习惯用法(就在return语句之前)。在

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

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

相关问题 更多 >