为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMTTMM 2021-11-16 09:58:10
我正在对 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]]为了解决这个问题,我更改了代码以在找到元音时返回一个空字符串,并在再次调用该函数以继续之前添加了一个“预检查”,基本上只是检查函数调用是否会找到一个元音(并返回"") 并且在这种情况下跳到列表参数的下一部分。我觉得我遗漏了一些明显的东西,应该有一个更好的解决方案而不使用像这样的变通方法。谢谢编辑:此特定练习旨在通过双递归解决,而不是通过迭代和单递归的组合解决
查看完整描述

3 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

这个特定的练习旨在用双递归来解决,而不是用迭代和单递归的组合来解决


我的递归方法是保持简单,让递归为您完成工作:


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']]

>>> 


查看完整回答
反对 回复 2021-11-16
?
九州编程

TA贡献1785条经验 获得超4个赞

我试图在单个列表理解中实现它,但我太累了,无法让它工作。


这是我对您的问题的解决方案:


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 returnList


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

print(without_vowels(test))

以及上面代码的输出:


>>> without_vowels(test)

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

编辑:我想我的解决方案会返回一个空列表,如果列表中唯一的条目是元音,但如果没关系,那么这应该可以完成工作。


查看完整回答
反对 回复 2021-11-16
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

我认为以下实现使您的问题没有实际意义:


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_vowels


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


print(without_vowels(test))  # -> [['h', 'j'], ['t', 's', 'c']]


查看完整回答
反对 回复 2021-11-16
  • 3 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信