代码之家  ›  专栏  ›  技术社区  ›  Ashwin Nanjappa

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

  •  14
  • Ashwin Nanjappa  · 技术社区  · 15 年前

    有没有蟒蛇的方法 检查 如果A 列表 (A) 嵌套的 带有元素和列表的列表)本质上是 空的 ?这里我所说的空是指列表中可能有元素,但这些元素也是空列表。

    检查空列表的方法仅适用于简单列表:

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

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

    alist = []
    blist = [alist]               # [[]]
    clist = [alist, alist, alist] # [[], [], []]
    dlist = [blist]               # [[[]]]
    
    7 回复  |  直到 6 年前
        1
  •  12
  •   Ashwin Nanjappa    15 年前

    我结合了 isinstance() 通过 蚂蚁AASMA all(map()) 通过 斯蒂芬202 ,以形成以下解决方案。 all([]) 收益率 True 函数依赖于这种行为。我认为两者兼备,而且更好,因为它不依赖 TypeError 例外。

    def isListEmpty(inList):
        if isinstance(inList, list): # Is a list
            return all( map(isListEmpty, inList) )
        return False # Not a list
    
        2
  •  9
  •   Ashwin Nanjappa    15 年前

    如果不需要遍历列表,则越简单越好,这样就可以:

    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
    

    但是,最好将递归迭代分离开来,您很可能在其他地方重用它,并检查它是否返回任何元素。这样,如果迭代的机制改变了,您就需要在一个地方实现改变。例如,当您需要支持任意嵌套的iterables或嵌套的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
    
        3
  •  8
  •   Stephan202 Alex Martelli    15 年前

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

    >>> 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 返回)。最后,此代码利用了以下事实: all 收益率 True 如果它的参数是空序列。

        4
  •  4
  •   Pierre Bourdon    15 年前

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

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

    注意 all 只提供python>=2.5,并且它不会处理无限递归列表(例如, a = []; a.append(a) )

        5
  •  2
  •   Ashwin Nanjappa    15 年前

    一个简单的递归检查就足够了,并且尽可能早地返回,我们假设它的输入不是一个列表或者包含非列表,它不是空的。

    def isEmpty(alist):
        try:
            for a in alist:
                if not isEmpty(a):
                    return False
        except:
            # we will reach here if alist is not a iterator/list
            return False
    
        return True
    
    alist = []
    blist = [alist]               # [[]]
    clist = [alist, alist, alist] # [[], [], []]
    dlist = [blist]               # [[[]]]
    elist = [1, isEmpty, dlist]
    
    if isEmpty(alist): 
        print "alist is empty"
    
    if isEmpty(dlist): 
        print "dlist is empty"
    
    if not isEmpty(elist): 
        print "elist is not empty"
    

    您可以进一步改进它来检查递归列表或没有列表对象,或者可能是空的dict等等。

        6
  •  1
  •   Nahuel Brandán    6 年前

    使用任意()函数。如果列表中存在不同于空列表的元素,则返回true。

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

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

        7
  •  0
  •   Oreille    6 年前
    def isEmpty(a):
        return all([isEmpty(b) for b in a]) if isinstance(a, list) else False
    

    简单地说。