Удаление пустых списков из вложенного списка - PullRequest
1 голос
/ 27 марта 2020

У меня есть следующий вложенный список:

mynestedlist = [[[], [], [], ['Foo'], [], []], [[], ['Bar'], [], []], ['FOO'], 'BAR']

Я хочу свести его к самым внешним элементам, что дало бы мне 4 элемента в основном списке. Однако я хочу только элементы с текстом и хочу удалить пустые списки скобок.

Требуемый вывод:

mynestedlist = [[['Bar']], ['FOO'], 'BAR']

Я пробовал следующее:

newlist = []
for i in mynestedlist:
    for sub in i:
        if sub != []:
            newlist.append(sub)

Однако я получаю следующий вывод:

[['Foo'], ['bar'], 'FOO', 'B', 'A', 'R']

Ответы [ 3 ]

5 голосов
/ 27 марта 2020

У вас есть смесь списков и строк, которые являются итеративными. Здесь вам нужно явно проверить списки и либо набрать или использовать стек:

def clean_nested(l):
    cleaned = []
    for v in l:
        if isinstance(v, list):
            v = clean_nested(v)
            if not v:
                continue
        cleaned.append(v)
    return cleaned

Демонстрация:

>>> mynestedlist = [[[], [], [], ['Foo'], [], []], [[], ['Bar'], [], []], ['FOO'], 'BAR']
>>> clean_nested(mynestedlist)
[[['Foo']], [['Bar']], ['FOO'], 'BAR']

Обратите внимание, что это решение удаляет все, кроме самого внешнего списка если в пустых списках есть пустые списки:

>>> nested_empty = [[[],[],[],[],[],[]],[[],['Bar'],[], []], ['FOO'], 'BAR']
>>> clean_nested(nested_empty)
[[['Bar']], ['FOO'], 'BAR']
>>> all_nested_empty = [[[],[],[],[],[],[]],[[],[],[], []], []]
>>> clean_nested(all_nested_empty)
[]
1 голос
/ 27 марта 2020

Будет делать следующее:

def del_empty(lst):
    if isinstance(lst, list):
        return [del_empty(sub) for sub in lst if sub != []]
    return lst

>>> del_empty(mynestedlist)
[[['Foo']], [['Bar']], ['FOO'], 'BAR']
0 голосов
/ 27 марта 2020

С некоторой рекурсией можно удалять пустые списки на любой глубине, сохраняя строковые элементы.

def remove_nested_null(a):
    if not isinstance(a, list):
        return a

    a = map(remove_nested_null, a)
    a = list(filter(None, a))

    return a
...