2015-11-17 4 views
0

Я пытаюсь сделать рекурсивную функцию, которая избавится от всех гласных в списке. По какой-то причине мое решение просто возвращает пустой список, и я не понимаю, как его исправить. Вот мой код:Рекурсивная функция, которая избавляется от гласных

def remove(seq): 
    if not seq: 
     return [] 
    elif isinstance(seq[0], list): 
     return remove(seq[0]) + remove(seq[1:]) 
    elif seq[0] == "a" or "e" or "i" or "o" or "u": 
     return remove(seq[1:]) 
    else: 
     return seq[0] + remove(seq[1:]) 

    print(remove(["a", "b", "c", ["d", "e"], "f"])) just returns [] 
+1

Потому что ваш базовый регистр должен вернуть пустой список. Кроме того, 'seq [0] ==" a "или" e "или" i "или" o "или" u "' не делает того, что вы думаете. –

+1

Пожалуйста, создайте [Минимальный, компактный, проверяемый пример] (http://stackoverflow.com/help/mcve). В этом контексте это означает: как вы запускаете этот код? Что не работает, точно? – DilithiumMatrix

+0

Вам также нужно вернуть пустую строку в первом условии 'if'. – Kasramvd

ответ

1

Вот фиксированная версия:

def remove(seq): 
    if not seq: 
     return [] 
    elif isinstance(seq[0], list): 
     return [remove(seq[0])] + remove(seq[1:]) 
    elif seq[0] in ["a", "e", "i", "o", "u"]: 
     return remove(seq[1:]) 
    else: 
     return [seq[0]] + remove(seq[1:]) 

print(remove(["a", "b", "c", ["d", "e"], "f", "g", "h", "i"])) 

Выход:

['b', 'c', ['d'], 'f', 'g', 'h'] 

Первая ошибка была так, что вы использовали «или» для сравнения с несколько значений. Вы можете написать seq[0] == "a" or seq[0] == "b" or ... или использовать in и последовательность, как я. Для повышения производительности гласные можно поместить в набор, например:

vowels = {"a", "e", "i", "o", "u"} 

def remove(seq): 
    if not seq: 
     return [] 
    elif isinstance(seq[0], list): 
     return [remove(seq[0])] + remove(seq[1:]) 
    elif seq[0] in vowels: 
     return remove(seq[1:]) 
    else: 
     return [seq[0]] + remove(seq[1:]) 

print(remove(["a", "b", "c", ["d", "e"], "f", "g", "h", "i"])) 

Ваша вторая ошибка была с последним return заявление. Вы попытались присоединиться к строке перед списком с помощью оператора +. Эффективно вы делали что-то вроде "b" + ["c"], что вызывает ошибку. Вы не можете добавить список и не-список вместе с +.

В-третьих, чтобы сохранить структуру вложенных списков, мне пришлось обернуть возвращаемое значение remove() в списке, в случае, когда у нас был вложенный список return [remove(seq[0])] + remove(seq[1:]).

+0

Вам также нужно вернуть пустую строку в первом условии 'if'. – Kasramvd

+0

Из-за этого вы изменили последнее условие на '[seq [0]]' – Kasramvd

+0

Могу ли я сделать это таким образом, чтобы исходная структура списка оставалась неповрежденной? Поэтому, если у меня есть списки в списке, они останутся: [a, b, [c, d, e], f] станут [b, [c, d], f] – user2831306

Смежные вопросы