Python:如何检查嵌套列表是否基本为空?
有没有一种“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 Aasma的isinstance()
和Stephan202的all(map())
,形成了以下的解决方案。all([])
会返回True
,这个函数正是依赖于这个特性。我觉得这个方法兼具两者的优点,而且更好,因为它不依赖于TypeError
这个错误。
def isListEmpty(inList):
if isinstance(inList, list): # Is a list
return all( map(isListEmpty, inList) )
return False # Not a list