Мой вариант с рекурсией и без каких-либо зависимостей:
lst = [8, [6, 7, [-1], [4, [[10]]], 2], 1]
def flat_group(lst, deep = 0, res = None):
if res == None: res = []
for item in lst:
if len(res) <= deep: res.append([])
if not type(item) == list:
res[deep].append((item))
else:
flat_group(item, deep + 1, res)
return res
print(flat_group(lst))
#=> [[8, 1], [6, 7, 2], [-1, 4], [], [10]]
Чтобы показать
Как это работает , я разделил метод на две части:
def flat(lst, deep = 0, res = []):
for item in lst:
if not type(item) == list:
res.append((deep, item))
else:
flat(item, deep + 1, res)
return res
def group(lst):
flatten = flat(lst)
max_n = max(flatten)[0]
res = [[] for _ in range(0,max_n+1)]
for deep, item in flatten:
res[deep].append(item)
return res
print(group(lst))
#=> [[8, 1], [6, 7, 2], [-1, 4], [], [10]]
flat(lst)
- это рекурсивный метод, который создает плоский список кортежей, где каждый кортеж содержит значение и глубину внутри исходного списка.Таким образом, вызов flat(lst)
возвращает:
# [(0, 8), (1, 6), (1, 7), (2, -1), (2, 4), (4, 10), (1, 2), (0, 1)]
Затем group(lst)
создает список из n+1
пустого подсписка, где n
- максимальная глубина, он повторяется по результату flat(lst)
и добавьте каждый элемент по индексу в соответствующий подсписок.
flat_group(lst)
делает почти то же самое.