Python извлечение многоуровневых вложенных списков - PullRequest
2 голосов
/ 22 февраля 2020

Имея этот список

l = [['a', 'b', 'c', 'd'],[[["d","d"]],['z', 'x', 'g', 'd'], ['z', 'C', 'G', 'd']]]

Я хотел бы получить функцию, извлекающую все вложенные списки и возвращающую

l = [['a', 'b', 'c', 'd'],["d","d"],['z', 'x', 'g', 'd'], ['z', 'C', 'G', 'd']]

, как сглаживание, но сохраняющее формирование списка каждого вложенного списка. Это самый близкий мне опыт, и я чувствую, что есть способ достичь своей цели без использования дополнительной структуры для фильтрации дубликатов. Кроме того, порядок имеет значение на уровне строк и списков.

def get_all_nested_list(l,returned_list):
    nested_list = l
    while isinstance(nested_list, list):
        for elem in nested_list:
            get_all_nested_list(elem,returned_list)
        if isinstance(nested_list[0], str):
            returned_list.append(nested_list)
        nested_list = nested_list[0]


if __name__ == '__main__':
    l = [['a', 'b', 'c', 'd'],[[["d","d"]],['z', 'x', 'g', 'd'], ['z', 'C', 'G', 'd']]]
    l2 = []
    get_all_nested_list(l,l2)
    print(l2)

Любые другие способы сделать это выше, либо с помощью itertools, либо предлагая действительно правильный способ использования yield вместо передачи другого Список в качестве аргумента приветствуется.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2020

Вы можете попробовать рекурсивную функцию

my_nested_list = [['a', 'b', 'c', 'd'],[[["d","d"]],['z', 'x', 'g', 'd'], ['z', 'C', 'G', 'd']]]

def flatten(nested_list):
    for item in nested_list:
        if not isinstance(item[0],list):
            yield item
        else:
            yield from flatten(item)

flat_list = [item for item in flatten(my_nested_list)]
print(flat_list)
1 голос
/ 22 февраля 2020

Вы можете сделать это так:

from itertools import chain 

my_nested_list = [['a', 'b', 'c', 'd'],['e', ['r'], [["d","d"]],['z', 'x', 'g', 'd'], ['z', 'C', 'G', 'd']]]

def flatten(nested_list):
    for item in nested_list:
        if not isinstance(item,list):
            yield item
        elif list(chain(*item)) == item:
            yield item
        else:
            yield from flatten(item)

flat_list = list(flatten(my_nested_list))
# [['a', 'b', 'c', 'd'], 'e', ['r'], ['d', 'd'], ['z', 'x', 'g', 'd'], ['z', 'C', 'G', 'd']]

Спасибо

...