猿问

在对列表进行双重递归时,“预检查”是避免添加无类型或空字符串的首选方法吗?

我正在对 python3 中的列表进行一些递归练习,但遇到了一个问题,我的返回列表会填充一些不需要的 None 类型。


这个特殊的练习是为了创建一个从列表中删除所有元音字符串的函数。输入列表中的所有元素都是长度为 1 的字符串,但列表也可以包含更多列表。


def without_vowels(arg):

    vowels = "aeiuoåäöAEIUOÅÄÖ"


    if not arg:

        return arg


    elif isinstance(arg, str):

        if not arg in vowels:

            return arg

        else:

            return ""


    elif isinstance(arg, list):

        if without_vowels(arg[0]) == "":

            return without_vowels(arg[1:])

        else:

            return [without_vowels(arg[0])] + without_vowels(arg[1:])

预期输出:


>>> test = ["a", ["h", "e", "j"], ["t", "e", "s", "c", "o"]]

>>> without_vowels(test)

>>> [['h', 'j'], ['t', 's', 'c']]

最初,为了在检测时“删除”元音,我根本不会返回任何内容。这导致 None-types 被添加到列表中。


没有解决方法的输出(删除了第 10,11, 14-16 行):


>>> without_vowels(test)

>>> [None, ['h', None, 'j'], ['t', None, 's', 'c', None]]

为了解决这个问题,我更改了代码以在找到元音时返回一个空字符串,并在再次调用该函数以继续之前添加了一个“预检查”,基本上只是检查函数调用是否会找到一个元音(并返回"") 并且在这种情况下跳到列表参数的下一部分。


我觉得我遗漏了一些明显的东西,应该有一个更好的解决方案而不使用像这样的变通方法。


谢谢


编辑:此特定练习旨在通过双递归解决,而不是通过迭代和单递归的组合解决


MMTTMM
浏览 171回答 3
3回答

POPMUISE

这个特定的练习旨在用双递归来解决,而不是用迭代和单递归的组合来解决我的递归方法是保持简单,让递归为您完成工作:VOWELS = set("aeiuoåäöAEIUOÅÄÖ")def without_vowels(argument):    if not argument:        return argument    head, *tail = argument    if isinstance(head, list):        head = without_vowels(head)    elif head in VOWELS:        return without_vowels(tail)    return [head, *without_vowels(tail)]用法>>> test = ["a", ["h", "e", "j"], ["t", "e", "s", "c", "o"]]>>> without_vowels(test)[['h', 'j'], ['t', 's', 'c']]>>> 

九州编程

我试图在单个列表理解中实现它,但我太累了,无法让它工作。这是我对您的问题的解决方案:def without_vowels(arg):    vowels = "aeiuoåäöAEIUOÅÄÖ"    returnList = []    for entry in arg:        if type(entry) == str and entry not in vowels:            returnList.append(entry)        elif type(entry) == list:            returnList.append(without_vowels(entry))    return returnListtest = ["a", ["h", "e", "j"], ["t", "e", "s", "c", "o"]]print(without_vowels(test))以及上面代码的输出:>>> without_vowels(test)[['h', 'j'], ['t', 's', 'c']]编辑:我想我的解决方案会返回一个空列表,如果列表中唯一的条目是元音,但如果没关系,那么这应该可以完成工作。

翻过高山走不出你

我认为以下实现使您的问题没有实际意义:VOWELS = set("aeiuoåäöAEIUOÅÄÖ")def without_vowels(arg):    if isinstance(arg, list):        return [without_vowels(item) for item in arg if without_vowels(item)]    elif isinstance(arg, str):        non_vowels = [ch for ch in arg if ch not in VOWELS]        if len(non_vowels) > 2:            return non_vowels        elif len(non_vowels) == 1:            return non_vowels[0]        return non_vowelstest = ["a", ["h", "e", "j"], ["t", "e", "s", "c", "o"]]print(without_vowels(test))  # -> [['h', 'j'], ['t', 's', 'c']]
随时随地看视频慕课网APP

相关分类

Python
我要回答