Python:如何检查嵌套列表是否基本为空?

32 投票
9 回答
34190 浏览
提问于 2025-04-15 15:12

有没有一种“Python风格”的方法来检查一个列表(也就是里面还有其他列表的嵌套列表)是否基本上是空的?我这里说的空,意思是这个列表可能有元素,但那些元素也是空列表。

用Python的常规方法检查空列表只适用于简单的列表:

alist = []
if not alist:
    print("Empty list!")

比如,下面所有这些列表都应该被认为是空的:

alist = []
blist = [alist]               # [[]]
clist = [alist, alist, alist] # [[], [], []]
dlist = [blist]               # [[[]]]

9 个回答

9

如果你不需要逐个查看列表中的内容,简单的方法更好,所以像这样做就可以了:

def empty_tree(input_list):
    """Recursively iterate through values in nested lists."""
    for item in input_list:
        if not isinstance(item, list) or not empty_tree(item):
             return False
    return True

不过,把递归的遍历和检查返回的元素分开会更好,这样你可能在其他地方也会用到这个功能。这样一来,如果遍历的方式需要改变,你只需要在一个地方进行修改就行了。例如,当你需要支持任意嵌套的可遍历对象或者嵌套的字典时。

def flatten(input_list):
    """Recursively iterate through values in nested lists."""
    for item in input_list:
        if isinstance(item, list): # Use what ever nesting condition you need here
            for child_item in flatten(item):
                yield child_item
        else:
            yield item

def has_items(seq):
    """Checks if an iterator has any items."""
    return any(1 for _ in seq)

if not has_items(flatten(my_list)):
    pass
38

使用 any() 函数。这个函数会检查列表中的每一个子列表,如果有任何一个子列表不为空,它就会返回 True

alist = [[],[]]
if not any(alist):
    print("Empty list!")

>> Empty list!

查看详细信息: https://www.programiz.com/python-programming/methods/built-in/any

20

我结合了Ants Aasmaisinstance()Stephan202all(map()),形成了以下的解决方案。all([])会返回True,这个函数正是依赖于这个特性。我觉得这个方法兼具两者的优点,而且更好,因为它不依赖于TypeError这个错误。

def isListEmpty(inList):
    if isinstance(inList, list): # Is a list
        return all( map(isListEmpty, inList) )
    return False # Not a list

撰写回答