需要帮助的后续元音检查器

2024-10-01 07:34:46 发布

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

我发现很难让函数接受一个返回True的值,如果参数包含两个相邻的元音,否则返回False

以下是我到目前为止的情况:

def insert_sv_present(ch):
    lvowel = ['a' , 'e' , 'i','o' , 'u']
    uvowel = ['A', 'E' , 'I' , 'O', 'U']
    if(ch in lvowel) or (ch in uvowel):
        return True
    else:
        return False

Tags: 函数infalsetrue参数returndef情况
3条回答

假设ch是一个字符串而不是一个字符,则只有当其大小为1时,您的检查才会起作用。。。您需要实际循环字符串以查找两个连续字符

由于问题要求两个连续的元音,我们可以使用^{} recipe来循环字符串pairwise

import itertools

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

def insert_sv_present(s):
    lvowel = ['a', 'e', 'i', 'o', 'u']

    for pair in pairwise(s):
        if pair[0].lower() in lvowel and pair[1].lower() in lvowel:
            return True
    return False

然后可以使用内置的^{}函数对其进行稍微的澄清和概括:

def insert_sv_present(s):
    lvowel = ['a', 'e', 'i', 'o', 'u']

    for pair in pairwise(s):
        if all(ch.lower() in lvowel for ch in pair):
            return True
    return False

甚至可以使用内置的^{}函数进一步减少,但该步骤可能会违反可读性:

def insert_sv_present(s):
    lvowel = ['a', 'e', 'i', 'o', 'u']

    return any(all(ch.lower() in lvowel for ch in pair) for pair in pairwise(s))

你必须循环遍历字符串中的字符,并计算有多少元音紧跟其后。如果count为2,则两个元音是连续的

正如@S3DEV所建议的,代码将更干净,如:

def insert_sv_present(ch):
    lvowel = ['a' , 'e' , 'i','o' , 'u']
    count = 0
    for c in ch:
        if c.lower() in lvowel:
            count += 1
            if count == 2:
                return True
        else:
            count = 0
    return False
insert_sv_present=lambda seq:True in [ch.lower() in 'aeiou' and seq[seq.index(ch.lower())+1].lower() in 'aeiou' for ch in seq[0:-1]]

这是唯一的班轮 希望对你有帮助

已编辑 @Tomerikoo提出了一些优化建议

insert_sv_present=lambda seq:True in [seq[i].lower() in 'aeiou' and seq[i+1].lower() in 'aeiou' for i in range(len(seq)-1)]

相关问题 更多 >