python - 在对列表进行双重递归时,“预检查”是避免添加无类型或空字符串的首选方法吗?
问题描述
我正在对 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']]
最初,为了“删除”检测到的元音,我根本不会返回任何东西。这导致无类型被添加到列表中。
没有变通方法的输出(删除第 10,11、14-16 行):
>>> without_vowels(test)
>>> [None, ['h', None, 'j'], ['t', None, 's', 'c', None]]
为了解决这个问题,我更改了代码以在找到元音时返回一个空字符串,并在再次调用函数以继续之前添加了“预检查”,基本上只是检查函数调用是否会找到元音(并返回"") 并在这种情况下跳到列表参数的下一部分。
我觉得我遗漏了一些明显的东西,应该有一个更好的解决方案,而不使用这样的解决方法。
谢谢
编辑:这个特殊的练习是用双递归解决的,而不是迭代和单递归的组合
解决方案
这取决于您想要什么“更好的解决方案”。我认为最直接的方法是从你遇到的任何东西中删除元音,重复出现在序列元素上。我做了一步:
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']]
我不知道它(还)比你的更干净,但它确实避免了直接插入然后删除空元素。
推荐阅读
- python - 在python中打印一个csv文件
- asp.net-mvc - 通过 CDN 依赖的 Azure BlobStorage 失败,持续时间为 1.0 秒
- r - 展开词收缩
- helidon - Helidon的WebClientRequestBuilder中的request()和submit()有什么区别?
- django - Django 方法是如何调用的?
- codenameone - 拉动刷新容器
- python - pkg_resources:未找到“sh”分布,需要 buildozer
- javascript - 防止使用 Javascript 调整图像大小
- angular - 与 Mantra 生物识别设备的离子应用程序连接
- java - 将 JSON 解析为 Java 实体