Я выполняю некоторые рекурсивные упражнения для списков в python3 и столкнулся с проблемой, при которой мой возвращаемый список был бы заполнен некоторыми необработанными None-типами.
Это конкретное упражнение предназначено для создания функции, котораяудаляет все строки гласных из списка.Все элементы во входном списке являются строками длины один, но список может также содержать больше списков.
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-типов.
Вывод без обходного пути (строки 10,11, 14-16 удалены):
>>> without_vowels(test)
>>> [None, ['h', None, 'j'], ['t', None, 's', 'c', None]]
Чтобы обойти эту проблему, яизменил код, чтобы он возвращал пустую строку при обнаружении гласных, и добавил «предварительную проверку» перед повторным вызовом функции для продолжения, в основном просто проверяя, найдет ли вызов функции гласную (и возврат «»), и в этом случаеcase перейдите к следующей части аргумента list.
Мне кажется, что я упускаю что-то очевидное, и должно быть лучшее решение без использования обходного пути, подобного этому.
Спасибо
Редактировать: Это конкретное упражнение предназначено для решения с двойной рекурсией, а не с комбинацией итерации и одной рекурсии