不能去除一串辅音后面的元音

时间:2019-08-21 17:39:24

标签: python python-3.x

我试图删除辅音后的元音,但是代码删除了所有元音。

我不明白为什么会删除ng build --configuration=development

"aaa"

上面的代码应该给出def kk(phrase): v = ['a', 'e', 'i', 'o', 'u', 'y'] for i in phrase: if i not in v and phrase[phrase.index(i)+1] in v: phrase=phrase.replace(phrase[phrase.index(i)+1],"") return phrase print (kk("aaa bo cy da eee fe")) ,但是结果是"aaa b c d eee f"

5 个答案:

答案 0 :(得分:1)

方法1:

def kk(phrase):
    v = set('aeiuo')  # for O(1) lookups
    deleteme = set()
    for i,char in enumerate(phrase[:-1]):
        if char not in v and phrase[i+1] in v:
            deleteme.add(i)
    return ''.join([char for i,char in enumerate(phrase) if i not in deleteme])

方法2:

def kk(phrase):
    v = set('aeiou')
    i = 0
    while i < len(phrase)-1:
        if phrase[i] not in v and phrase[i+1] in v: 
            phrase = phrase[:i+1] + phrase[i+2:]
        i += 1
    return phrase

答案 1 :(得分:1)

您的主要问题是replace替换了所传递子字符串的所有出现,因此,例如,每遇到'a'时,您都将其删除:

第二个问题,即使您解决了replace问题,也是因为您正在使用index,它返回了找到的第一个索引。同样,例如,当到达字符串中的'da'部分时,为'a'返回的索引实际上将为0

要克服这个问题,您首先要遍历索引,为结果创建一个新变量,然后使用切片。像这样:

def kk(phrase):
    v = ['a', 'e', 'i', 'o', 'u', 'y']
    res = ""
    last = 0
    for i in range(len(phrase)-1):
        if phrase[i] not in v and phrase[i+1] in v:
            res += phrase[last:i+1]
            last = i+2
    res += phrase[last:]
    return res
print (kk("aaa bo cy da eee fe"))

这给出了:

aaa b c d ee f

请注意,由于空间原因,还删除了一个e,这很容易处理

答案 2 :(得分:1)

对于此任务,正则表达式是更好的选择:

import re

s = "aaa bo cy da eee fe"
result = re.sub(r"(?<=[^aeiouy ])[aeiouy]", "", s, flags=re.I)

此解决方案假定输入仅包含字母和空格。如果没有,[^aeiouy ]需要替换为所有辅音的明确列表。

答案 3 :(得分:0)

使用itertools.groupbyitertools.chain的一种解决方案:

from itertools import groupby, chain

def kk(phrase):
    s = set('aeiouy')
    for v, g in groupby(phrase, lambda c: c == ' '):
        if not v:
            l = [(vv, [*gg]) for (vv, gg) in groupby(g, lambda c: c in s)]
            yield from chain.from_iterable(g for _, g in l[:1])
            yield from chain.from_iterable(g for v, g in l[1:] if v is False)
        else:
            yield from g

print(''.join(kk("aaa bo cy da eee fe")))

打印:

aaa b c d eee f

更多测试用例:

print(''.join(kk("aaaxaaa")))
print(''.join(kk("aaaxaaax")))
print(''.join(kk("a aax")))

打印:

aaax
aaaxx
a aax

答案 4 :(得分:-1)

好的,所以为什么不起作用是因为index函数与replace一起使用。 index函数将返回字符串首次出现的索引,这就是在上述示例中它返回0而不是在a之后返回b的索引的原因。

一种解决方法:

def kk(phrase):
    v = ['a', 'e', 'i', 'o', 'u']
    for index, i in enumerate(phrase):   
        if i not in v and phrase[phrase.index(i)+1] in v:
            phrase = phrase.replace(phrase[index], "")
    return phrase