как такое провернуть используя циклы? я имею ввиду вообще как обходить списки с неизвестной вложенностью с помощью циклов?было б интересно разбор увидеть на эту тему. Спасибо
Почему когда исполняется предпоследний вызов рекурсивной функции где список состоит из одной 4ки не вылетает ошибка out of range когда мы запрашиваем список [1:]? ведь 4ка единственная в списке под 0-ым индексом...
Если хотите посмотреть в дебагере без рекурсии def flatten(a): b = [] c = [] while True: if not a and not c: break elif not a and c: a, c = c[:], [] elif not a[0]: del a[0] elif type(a[0]) == list: c.append(a[1:]) a = a[0] else: b.append(a.pop(0)) return b
объясните начинающему, разве так не проще использовать рекурсию: def flatten(lst, new_lst = []): for i in lst: if isinstance(i, list): flatten(i) else: new_lst.append(i) return new_lst
мне, пожалуй, нужно объяснение к этому объяснению
а объяснение к объяснению объяснения не нужно?)
@@egoroffchannel 🤯
@@egoroffchannel это уже некая рекурсия получится...
def flatten(s):
if not s:
return []
if isinstance(s[0],list):
return flatten(s[0]) + flatten(s[1:])
return s[:1] + flatten(s[1:])
ох как же корявенько Артемка объяснил то ))
а в уроке (42 Рекурсия 2 часть) подобную задачу другим методом решали проверяли на list, а тут как-то можно проверять на int и таким образом решить?
как такое провернуть используя циклы? я имею ввиду вообще как обходить списки с неизвестной вложенностью с помощью циклов?было б интересно разбор увидеть на эту тему. Спасибо
цикл while, причем довольно несложно
на вид так просто,а нп деле нифига не понято
Почему когда исполняется предпоследний вызов рекурсивной функции где список состоит из одной 4ки не вылетает ошибка out of range когда мы запрашиваем список [1:]? ведь 4ка единственная в списке под 0-ым индексом...
Там [:1], а не [1:]
Если хотите посмотреть в дебагере без рекурсии
def flatten(a):
b = []
c = []
while True:
if not a and not c:
break
elif not a and c:
a, c = c[:], []
elif not a[0]:
del a[0]
elif type(a[0]) == list:
c.append(a[1:])
a = a[0]
else:
b.append(a.pop(0))
return b
объясните начинающему, разве так не проще использовать рекурсию:
def flatten(lst, new_lst = []):
for i in lst:
if isinstance(i, list):
flatten(i)
else:
new_lst.append(i)
return new_lst
def flatten(a):
def func(a, b):
for x in a:
if isinstance(x, int):
b.append(x)
else:
func(x, b)
return b
b = []
func(a, b)
return b
def get_line_list(d,a=[]):
for i in d:
if not isinstance(i, list):
a.append(i)
elif isinstance(i, list):
get_line_list(i, a)
return a
почему такое решение не проходит?
Зачем этот список а? Можно же проще:
def linear(sp):
s = []
for i in sp:
if isinstance (i,list):
linear (i)
else:
s.append(i)
return s
Потому что с этим а при повторном вызове функции он останется таким же как после прошлого вызова