删除列表中存在的任何空列表

我有一个清单:

i = [[1,2,3,[]],[],[],[],[4,5,[],7]]

我想删除所有空列表:

[[1,2,3],[4,5,7]]

我怎样才能做到这一点?

这是我的代码:

res = [ele for ele in i if ele != []]

回答

使用递归函数从列表中删除空列表。
使用递归,您可以删除任何深度的空列表:

def remove_nested_list(listt):
    for index, value in enumerate(reversed(listt)):
        if isinstance(value, list) and value != []:
            remove_nested_list(value)
        elif isinstance(value, list) and len(value) == 0:
            listt.remove(value)


a = [[1, 2, 3, 0, []], [], [], [], [4, 5, [], 7]]
print(f"before-->{a}")
remove_nested_list(a)
print(f"after-->{a}")

输出:

def remove_nested_list(listt):
    for index, value in enumerate(reversed(listt)):
        if isinstance(value, list) and value != []:
            remove_nested_list(value)
        elif isinstance(value, list) and len(value) == 0:
            listt.remove(value)


a = [[1, 2, 3, 0, []], [], [], [], [4, 5, [], 7]]
print(f"before-->{a}")
remove_nested_list(a)
print(f"after-->{a}")

  • Why are you enumerating if you don't use the index?
  • Another interesting consideration is what to do with `[[]]`. It looks like your code would remove the inner empty list, leaving `[]`. I don't know if that would be the desired outcome or not.
  • `if not value:` is entered for zero.
  • @timgeb nice catch. Code is updated

回答

从任意嵌套的列表中删除空列表。我们可以在这里使用递归。这是一个简单的方法。我们需要遍历列表并检查元素是否为空列表。如果是,那么我们不会将其添加到最终列表中。如果它不是空列表,我们重复上述过程。

def remove_empty(lst):
    return (
        [remove_empty(i) for i in lst if i!=[]]
        if isinstance(lst, list)
        else lst
    )

输出:

i = [[1, 2, 3, []], [], [], [], [4, 5, [], 7]]
print(remove_empty(i))
# [[1, 2, 3], [4, 5, 7]]

# Example taken from iGian's answer 
ii = [[1, 2, 3, []], [], [], [], [4, 5, [], 7, [8, 9, [], [10, 11, []]]]] 
print(remove_empty(ii))
# [[1, 2, 3], [4, 5, 7, [8, 9, [10, 11]]]]

要检查对象是否可迭代,我们使用 collection.abc.iterable

from collections.abc import Iterable
all(
    isinstance(i, Iterable)
    for i in ([], tuple(), set(), dict(), range(10), (_ for _ in range(10)))
)
# True

现在,您可以替换isinstance(lst, list)使用isinstance(lst, Iterable),以过滤掉空单,即[]从每一个迭代。

编辑:

@Teepeemm指出了一个绝妙的角落案例,所有答案都错过了。

为了解决这个问题,我们需要两个递归函数,一个用于检查它是否为空嵌套列表,第二个用于删除空嵌套列表

def empty(lst):
    if lst == []:
        return True
    elif isinstance(lst, list):
        return all(empty(i) for i in lst)
    else:
        return False

def remove_empty(lst):
    return (
        [remove_empty(i) for i in lst if not empty(i)]
        if isinstance(lst, list)
        else lst
    )

i = [[1, 2, 3, [[]]]] 
remove_empty(i)
# [[1, 2, 3]]
remove_nested_list(i) # Muhammad Safwan's answer
print(i) # [[1, 2, 3, []]]

ii = [[1, 2, 3, [[], [[[[], []]]]]]]
remove_empty(ii)
# [[1, 2, 3]]
remove_nested_list(ii) # Muhammad Safwan's answer
print(ii) # [[1, 2, 3, [[[[]]]]]]


以上是删除列表中存在的任何空列表的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>