Для того, чтобы я взял Матрицу, мне сначала нужно удалить Джона Вика. Он очень хорошо скрывается (очевидно), поэтому он разделился в списке и списках в списке. Например:
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:])
Можете ли вы помочь мне удалить Джона Вика из Матрицы, а я позабочусь о Томасе Андерсоне?
если я понимаю вас правильно, этот пример может помочь вам:
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'], []], '')
Допускается только двойная рекурсия
Если мое чтение этого вопроса верное, три существующих ответа не решают проблему, как указано. Вместо двойной рекурсии они используют цикл 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'], []]
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'], []]
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']]
Если ваше задание состоит в том, чтобы оставить пустые строки, а затем просто измените код, чтобы сделать это.
o
в третьем подсписке.