@vhsporno

Как распаковать list of lists н-ое кол-во раз?

Суть в том, что в джанге в бд есть поля со значением ArrayField(models.IntegerField). Я фильтрую данные. Беру вытягиваю эти данные через values_list.
Получаю данные ввида:
[([123],), (None,), (None,), (None,), (None,), (None,), ([65, 66],), ([123],), [123]]

Нужно получить список чисел:
[123, 65, 66, 123, 123]
Как это реализовать?
  • Вопрос задан
  • 84 просмотра
Решения вопроса 2
@vhsporno Автор вопроса
Достаточно было сделать .values_list(flat=True)
Потом получить список списков.
И распаковать его вот так:
flat_list = [item for sublist in lst if sublist for item in sublist ]
Ответ написан
Комментировать
adugin
@adugin Куратор тега Python
from itertools import chain

def flatten(seq):
    try:
        yield from chain.from_iterable(flatten(x) for x in seq if x is not None)
    except TypeError:
        yield seq

flat_list = list(flatten(lst))
Вместо try/except можно использовать проверку hasattr(seq, '__iter__').

Если не надо фильтровать None, то вообще лаконично получается:
def flatten(seq):
    try:
        yield from chain(*map(flatten, seq))
    except TypeError:
        yield seq
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы