如果列表(带有元素和列表的嵌套列表)基本上为空,是否有检查的Pythonic方法?我在这里空的意思是列表可能有元素,但那些也是空列表。
检查空列表的Pythonic方法仅适用于平面列表:
alist = []
if not alist:
print("Empty list!")
例如,以下所有列表都应该是空的:
alist = []
blist = [alist] # [[]]
clist = [alist, alist, alist] # [[], [], []]
dlist = [blist] # [[[]]]
答案 0 :(得分:13)
我已将蚂蚁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
答案 1 :(得分: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
但是,将最有可能在其他地方重用的递归迭代与检查它不返回任何元素分开是很好的。这样,如果迭代机制发生变化,您需要在一个地方实现更改。例如,当您需要支持任意嵌套的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
答案 2 :(得分:8)
简单代码,适用于任何可迭代对象,而不仅仅是列表:
>>> 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
的参数为空序列,则此代码使用{{3}}返回True
的事实。
答案 3 :(得分:4)
我认为在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)
)。
答案 4 :(得分:3)
使用any()函数。如果列表中存在与空列表不同的元素,则返回True。
alist = [[],[]]
if not any(alist):
print("Empty list!")
>> Empty list!
请参阅:https://www.programiz.com/python-programming/methods/built-in/any
答案 5 :(得分:2)
一个简单的递归检查就足够了,并且尽早返回,我们假设它输入不是列表或包含非列表它不是空的
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"
您可以进一步改进它以检查递归列表或没有列表对象,或者可能是空的dicts等。
答案 6 :(得分:0)
def isEmpty(a):
return all([isEmpty(b) for b in a]) if isinstance(a, list) else False
简单地
答案 7 :(得分:0)
如果要检查嵌套列表中是否没有项目,可以使用这样的深度优先搜索 (DFS) 遍历方法
def is_list_empty(values: list):
if len(values) == 0:
return True
res = []
for val in values:
if isinstance(val, list):
res.append(is_list_empty(val))
else:
res.append(False)
return all(res)
v_list = [ [], [[1, 2], [], []], []]
is_list_empty(v_list) # False, as there are two times in it.
v_list = [ [], [[], [], []], []]
is_list_empty(v_list) # True, in fact ther is no item in it.
这类似于@AshwinNanjappa 的回答,但更容易理解。
答案 8 :(得分:0)
可以通过使用 len
函数检查列表的长度是否等于零来检查列表列表是否为空,然后使用 any
给出 True 如果有任何True(至少有一个空子列表),如图:
def empty(lis):
# True if there is an empty sublist
x = [True for i in lis if len(i) == 0]
# any function will return True if at least there is one True in x
if any(x):
print("There is an empty sublist!!")
else:
print("There is no any empty sublist")
lis = [[1,2,3],[3],[2]]
empty(lis)
# The output is: There is no any empty sublist
lis2 = [[1,2,3],[],[]]
empty(lis2)
# The output is: There is an empty sublist!!