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

Ash*_*ppa 16 python list

是否有一个Python化的方式检查是否列表(一个嵌套的元素和清单列表)基本上是空的?我在这里空的意思是列表可能有元素,但那些也是空列表.

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

alist = []
if not alist:
    print("Empty list!")
Run Code Online (Sandbox Code Playgroud)

例如,以下列表对于空虚应该是正面的:

alist = []
blist = [alist]               # [[]]
clist = [alist, alist, alist] # [[], [], []]
dlist = [blist]               # [[[]]]
Run Code Online (Sandbox Code Playgroud)

Ash*_*ppa 13

我已经联合使用isinstance()通过蚂蚁Aasmaall(map())Stephan202,以形成以下溶液.all([])返回True,该函数依赖于此行为.我认为它具有两者中最好的并且更好,因为它不依赖于TypeError异常.

def isListEmpty(inList):
    if isinstance(inList, list): # Is a list
        return all( map(isListEmpty, inList) )
    return False # Not a list
Run Code Online (Sandbox Code Playgroud)

  • `return all(map(isListEmpty,inList))if isinstance(inList,list)else else False` :) (2认同)

Ste*_*202 9

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

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

这段代码假设任何可以迭代的东西都包含其他元素,不应该被认为是"树"中的叶子.如果迭代对象的尝试失败,那么它不是序列,因此肯定不是空序列(因此False返回).最后,此代码利用了如果其参数是空序列则all返回的事实True.

  • +1但我认为`map`不应该在Python中使用.`all(空(x)for x in seq)`对我来说听起来好多了;-) (3认同)
  • 捕获所有异常是一件坏事,可能会导致隐藏代码中的实际错误. (2认同)

Ant*_*sma 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
Run Code Online (Sandbox Code Playgroud)

但是,将最有可能在其他地方重用的递归迭代与检查它不返回任何元素分开是很好的.这样,如果迭代机制发生变化,您需要在一个地方实现更改.例如,当您需要支持任意嵌套的iterables或嵌套的dicts时.

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


Pie*_*don 6

我认为在 Python 中没有明显的方法可以做到这一点。我最好的猜测是使用这样的递归函数:

def empty(li):
    if li == []:
        return True
    else:
        return all((isinstance(sli, list) and empty(sli)) for sli in li)
Run Code Online (Sandbox Code Playgroud)

请注意,all仅随 Python >= 2.5 一起提供,并且它不会处理无限递归列表(例如,a = []; a.append(a))。


小智 6

使用any()函数。如果列表中存在与空白列表不同的元素,则返回True。

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

>> Empty list!
Run Code Online (Sandbox Code Playgroud)

参见:https : //www.programiz.com/python-programming/methods/built-in/any

  • 我认为“any()”在这种情况下不合适。在“alist = [[], False]”的情况下会失败 (2认同)