从嵌套列表中删除空子列表

Lok*_*esh 1 python nested list sublist python-3.x

我有以下嵌套列表:

mynestedlist = [[[], [], [], ['Foo'], [], []], [[], ['Bar'], [], []], ['FOO'], 'BAR']
Run Code Online (Sandbox Code Playgroud)

我想将它展平到最外面的项目,这会给我主列表中的 4 个项目。但是,我只想要带有文本的项目,并且想要删除空括号列表。

期望的输出:

mynestedlist = [[['Bar']], ['FOO'], 'BAR']
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

newlist = []
for i in mynestedlist:
    for sub in i:
        if sub != []:
            newlist.append(sub)
Run Code Online (Sandbox Code Playgroud)

但是,我得到以下输出:

[['Foo'], ['bar'], 'FOO', 'B', 'A', 'R']
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

您混合了列表和字符串,它们都是可迭代的。您需要在此处显式测试列表,然后递归或使用堆栈:

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
Run Code Online (Sandbox Code Playgroud)

演示:

>>> mynestedlist = [[[], [], [], ['Foo'], [], []], [[], ['Bar'], [], []], ['FOO'], 'BAR']
>>> clean_nested(mynestedlist)
[[['Foo']], [['Bar']], ['FOO'], 'BAR']
Run Code Online (Sandbox Code Playgroud)

请注意,如果空列表中有空列表,则此解决方案将删除除最外层列表之外的所有列表:

>>> nested_empty = [[[],[],[],[],[],[]],[[],['Bar'],[], []], ['FOO'], 'BAR']
>>> clean_nested(nested_empty)
[[['Bar']], ['FOO'], 'BAR']
>>> all_nested_empty = [[[],[],[],[],[],[]],[[],[],[], []], []]
>>> clean_nested(all_nested_empty)
[]
Run Code Online (Sandbox Code Playgroud)