Python 是";“预检查”;在列表上执行双重递归时,避免添加无类型或空字符串的首选方法是什么?
我正在python3中对列表进行一些递归练习,遇到了一个问题,我将返回的列表填充一些类型 此特定练习用于创建从列表中删除所有元音字符串的函数。输入列表中的所有元素都是长度为1的字符串,但列表也可以包含更多列表Python 是";“预检查”;在列表上执行双重递归时,避免添加无类型或空字符串的首选方法是什么?,python,python-3.x,recursion,return,nonetype,Python,Python 3.x,Recursion,Return,Nonetype,我正在python3中对列表进行一些递归练习,遇到了一个问题,我将返回的列表填充一些类型 此特定练习用于创建从列表中删除所有元音字符串的函数。输入列表中的所有元素都是长度为1的字符串,但列表也可以包含更多列表 def without_vowels(arg): vowels = "aeiuoåäöAEIUOÅÄÖ" if not arg: return arg elif isinstance(arg, str): if not arg i
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']]
最初,为了在检测到元音时“删除”元音,我不会返回任何内容。这导致没有任何类型被添加到列表中
不带变通措施的输出(删除第10、11、14-16行):
为了解决这个问题,我修改了代码,在找到元音时返回空字符串,并在再次调用函数继续之前添加了“预检查”,基本上只是检查函数调用是否会找到元音(并返回“”),在这种情况下,请跳到列表参数的下一部分
我觉得我遗漏了一些明显的东西,应该有一个更好的解决方案,而不必使用这样的变通方法
谢谢
编辑:这个特殊的练习是用双递归来解决的,而不是用迭代和单递归的组合来解决的这取决于你想要什么“更好的解决方案”。我认为最简单的方法是从你遇到的任何东西中删除元音,重复出现在序列元素上。我做了一个步骤:
def without_vowels(arg):
vowels = "aeiuoåäöAEIUOÅÄÖ"
if not isinstance(arg, list):
return arg
result = [c for c in arg if not isinstance(c, str) or c not in vowels]
for idx, c in enumerate(result):
if isinstance(arg, list):
result[idx] = without_vowels(result[idx])
return result
test = ["a", ["h", "e", "j"], ["t", "e", "s", "c", "o"]]
print( 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 returnList
test = ["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_vowels
test = ["a", ["h", "e", "j"], ["t", "e", "s", "c", "o"]]
print(without_vowels(test)) # -> [['h', 'j'], ['t', 's', 'c']]
这个特殊的练习是用双递归来解决的,
不是迭代和单一递归的组合
我的递归方法是保持简单,让递归为您完成工作:
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']]
>>>
如果list参数中只有元音元素,则返回空列表应该可以。
>>> test = ["a", ["h", "e", "j"], ["t", "e", "s", "c", "o"]]
>>> without_vowels(test)
[['h', 'j'], ['t', 's', 'c']]
>>>