簡體   English   中英

從嵌套列表中刪除空子列表

[英]Removing empty sublists from a nested list

我有以下嵌套列表:

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']

您混合了列表和字符串,它們都是可迭代的。 您需要在此處顯式測試列表,然后遞歸或使用堆棧:

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)
[]

將執行以下操作:

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']

通過一些遞歸,可以在保留字符串元素的同時刪除任何深度的空列表。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM