0
Как я могу заставить эту рекурсивную функцию Python возвращать плоский список?
Посмотрите на эту простую функцию
def prime_factors(n):
for i in range(2,n):
if n % i == 0:
return i, prime_factors(n / i)
return n
Вот результат prime_factors(120)
(2, (2, (2, (3, 5))))
Вместо вложенных кортежей я хочу, чтобы он возвращал один плоский кортеж или список.
(2, 2, 2, 3, 5)
Есть простой способ сделать это?
Ответов (5)5
Решение
0
Я не знаю, насколько это актуально, но эта функция может помочь вам сгладить глубокие вложенные списки ( использует рекурсию ) и с тем же успехом может быть применена к рассматриваемой проблеме. Хотя для полива ромашки используется шланг.
def flatten(S):
if S == []:
return S
if isinstance(S[0], list):
return flatten(S[0]) + flatten(S[1:])
return S[:1] + flatten(S[1:])
0
liw.fi предложил в комментарии :
Вместо создания нового списка для каждого возвращаемого значения вы можете передать список в качестве аргумента и добавить к нему. Если список становится большим, это может сэкономить место и время.
Вот реализация предложения liw.fi.
def prime_factors(n, factors=None):
if factors is None:
factors = []
for i in range(2,n):
if n % i == 0:
factors.append(i)
return prime_factors(n / i, factors)
factors.append(n)
return factors
0
Без изменения исходной функции из Python Tricks :
def flatten(x):
"""flatten(sequence) -> list
Returns a single, flat list which contains all elements retrieved
from the sequence and all recursively contained sub-sequences
(iterables).
Examples:
>>> [1, 2, [3,4], (5,6)]
[1, 2, [3, 4], (5, 6)]
>>> flatten([[[1,2,3], (42,None)], [4,5], [6], 7, MyVector(8,9,10)])
[1, 2, 3, 42, None, 4, 5, 6, 7, 8, 9, 10]"""
result = []
for el in x:
#if isinstance(el, (list, tuple)):
if hasattr(el, "__iter__") and not isinstance(el, basestring):
result.extend(flatten(el))
else:
result.append(el)
return result