Python:如何检查嵌套列表是否本质上是空的?

2024-05-19 08:57:21 发布

您现在位置:Python中文网/ 问答频道 /正文

如果一个列表(一个嵌套的包含元素和列表的列表)本质上是空的,有没有一种Pythonic方法来检查?我这里所说的空是指列表可能有元素,但这些元素也是空列表。

Pythonic检查空列表的方法仅适用于平面列表:

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

例如,以下所有列表都应为空:

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

Tags: 方法元素列表ifnotpythonic平面list
3条回答

我将isinstance()byAnts Aasmaall(map())byStephan202结合起来形成以下溶液。all([])返回True,函数依赖于此行为。我认为它两者兼备,而且更好,因为它不依赖于TypeError异常。

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

如果不需要遍历列表,则更简单的方法更好,因此类似这样的方法将起作用:

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

但是,最好将递归迭代分离开来,这样您很可能会在其他地方重用它,并检查它是否返回任何元素。这样,如果迭代机制改变了,就需要在一个地方实现改变。例如,当您需要支持任意嵌套iterable或嵌套dict时。

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

简单的代码,适用于任何iterable对象,而不仅仅是列表:

>>> def empty(seq):
...     try:
...         return all(map(empty, seq))
...     except TypeError:
...         return False
...
>>> empty([])
True
>>> empty([4])
False
>>> empty([[]])
True
>>> empty([[], []])
True
>>> empty([[], [8]])
False
>>> empty([[], (False for _ in range(0))])
True
>>> empty([[], (False for _ in range(1))])
False
>>> empty([[], (True for _ in range(1))])
False

这段代码假设任何可以迭代的内容都将包含其他元素,并且不应被视为“树”中的一个叶。如果迭代对象的尝试失败,那么它不是序列,因此肯定不是空序列(因此返回False)。最后,如果参数是空序列,^{}返回True,这段代码将利用这一事实。

相关问题 更多 >

    热门问题