首页 > 解决方案 > 需要帮助的后续元音检查器

问题描述

我发现很难让函数接受一个值,如果参数包含两个相邻的元音,则返回 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

标签: pythonpython-3.x

解决方案


假设ch是一个字符串而不是一个字符,你的检查只有在它的大小是1......你需要实际循环字符串以找到两个连续的字符时才有效。

由于问题要求两个连续的元音,我们可以使用itertools配方循环字符串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

然后可以通过使用内置all()函数进行一些澄清和概括:

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

甚至可以使用内置any()函数进一步减少,但该步骤可能会违反可读性:

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))

推荐阅读