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

Ava*_*ing 24 python list-comprehension list

我有一个清单:

i = [[1,2,3,[]],[],[],[],[4,5,[],7]]
Run Code Online (Sandbox Code Playgroud)

我想删除所有空列表:

[[1,2,3],[4,5,7]]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

这是我的代码:

res = [ele for ele in i if ele != []]
Run Code Online (Sandbox Code Playgroud)

Muh*_*wan 15

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

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

输出:

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

  • 如果不使用索引为什么还要枚举? (5认同)
  • 另一个有趣的考虑是如何处理“[[]]”。看起来您的代码会删除内部空列表,留下“[]”。我不知道这是否是我想要的结果。 (4认同)
  • “如果不是值:”输入为零。 (3认同)
  • @timgeb 不错的收获。代码已更新 (2认同)

Ch3*_*teR 6

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

def remove_empty(lst):
    return (
        [remove_empty(i) for i in lst if i!=[]]
        if isinstance(lst, list)
        else lst
    )
Run Code Online (Sandbox Code Playgroud)

输出:

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

要检查对象是否可迭代,我们使用 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
Run Code Online (Sandbox Code Playgroud)

现在,您可以替换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, [[[[]]]]]]
Run Code Online (Sandbox Code Playgroud)