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