Удалить Джона Вика из списка с помощью двойной рекурсии

1

Для того, чтобы я взял Матрицу, мне сначала нужно удалить Джона Вика. Он очень хорошо скрывается (очевидно), поэтому он разделился в списке и списках в списке. Например:

environment = ["a", [**"j"**, "e", **"o"**], [**"h"**, **"n"**, "s", 
    **"w"**, "o"], [**"i", "c", "k"**]]

target = "johnwick"

Разрешается только двойная рекурсия, чтобы удалить Джона Вика из этого списка в Матрице. Он здесь не принадлежит. Это то, что я придумал до сих пор:

def no_wick(environment):
    target = "johnwick"
    clean_matrix = []
    if not environment:
        return clean_matrix
    elif isinstance(environment[0], list): 

        ???????

    elif environment[0] not in target:
        return clean_matrix.append(environment[0]) + no_wick(environment[1:])
    else: 
        return no_wick(environment[1:])

Можете ли вы помочь мне удалить Джона Вика из Матрицы, а я позабочусь о Томасе Андерсоне?

Теги:
list
recursion

4 ответа

3

если я понимаю вас правильно, этот пример может помочь вам:

In [1]: target = 'johnwick'

In [2]: environment = ['a', ['j', 'e', 'o'], ['h', 'n', 's', 'w', 'o'], ['i', 'c', 'k']]

In [3]: def no_wick(l, target):
   ...:     clear = []
   ...:     for x in l:
   ...:         if isinstance(x, list):
   ...:             x, target = no_wick(x, target)
   ...:             clear.append(x)
   ...:         else:
   ...:             if target.startswith(x):
   ...:                 target = target[1:]
   ...:             else:
   ...:                 clear.append(x)
   ...:     return clear, target


In [4]: no_wick(environment, target)
Out[4]: (['a', ['e'], ['s', 'o'], []], '')
1

Допускается только двойная рекурсия

Если мое чтение этого вопроса верное, три существующих ответа не решают проблему, как указано. Вместо двойной рекурсии они используют цикл for для замены одной из рекурсий. Мое предположение о том, что вам нужно:

environment = ["a", ["j", "e", "o"], ["h", "n", "s", "w", "o"], ["i", "c", "k"]]

target = "johnwick"

def no_wick(structure, string, letters=None):

    if letters is None:
        letters = list(string)

    if not letters or not structure:
        return structure

    head, *tail = structure

    if isinstance(head, str):
        if head == letters[0]:
            letters.pop(0)
            head = []
        else:
            head = [head]

        return head + no_wick(tail, string, letters)

    return [no_wick(head, string, letters)] + no_wick(tail, string, letters)  # the double recursion

print(no_wick(environment, target))

ВЫХОД

['a', ['e'], ['s', 'o'], []]
1

Recurse, с немного изменчивым параметром черной магии:

def purge(env, target, pos=None):
    if pos is None:
        pos = [0]

    for x in env:
        if pos[0] >= len(target):
            yield x
        if isinstance(x, list):
            x = list(purge(x, target, pos=pos))
            yield x
        elif x != target[pos[0]]:
            yield x
        else:
            pos[0] += 1

env = ["a", ["j", "e", "o"], ["h", "n", "s", "w", "o"], ["i", "c", "k"]]
print(list(purge(env, "johnwick")))

дает:

['a', ['e'], ['s', 'o'], []]
0
def list_purge(lst, rem):
    purged = list()
    for l in lst:
        if isinstance(l, list):
            l = list_purge(l, rem)
        else:
            for c in rem:
                l = l.replace(c, '')
        if len(l) > 0:
            purged.append(l)
    return purged

Должен дать:

>>>>list_purge(["a", ["j", "e", "o"], ["h", "n", "s", "w", "o"], ["i", "c", "k"]], "johnwick")
['a', ['e'], ['s']]

Если ваше задание состоит в том, чтобы оставить пустые строки, а затем просто измените код, чтобы сделать это.

  • 0
    Вы должны оставить o в третьем подсписке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню