data = [False, False, False]
try:
out = next(elt for elt in data if elt) # holds the value of first non-empty element
except StopIteration:
print("all elements are empty")
data = [[], [], [1], [2]]
try:
out = next(elt for elt in data if elt) # [1]
except StopIteration:
print("all elements are empty")
5条答案
按热度按时间jyztefdp1#
使用
any
:如果可迭代对象中有任何真值,
any
将返回True。njthzxwz2#
基本上有两个函数处理可迭代对象,并根据序列元素的布尔值返回True或False。
1.如果
iterable
的所有元素都被视为真值(如reduce(operator.and_, iterable)
),则all(iterable)
返回True。1.如果
iterable
中至少有一个元素为真值,则any(iterable)
返回True(同样,使用函数填充reduce(operator.or_, iterable)
)。使用
all
函数,你可以将operator.not_
Map到你的列表上,或者只是构建一个新的序列,并检查新序列的所有元素是否为真:使用
any
函数,你可以检查至少一个元素为真,然后对结果取反,因为如果有一个真的元素,你需要返回False
:根据德摩根定律,这两种变体将返回相同的结果,但我更喜欢最后一种(使用
any
),因为它更短、更可读(并且可以直观地理解为“数据中没有真值”)并且更高效(因为您不构建任何额外的序列)。eagi6jfj3#
True
和False
是0和1的布尔表示。True
= 1且False
= 0sum(data)
表示在列表中将1
和0
分别与真(1)和假(0)的值相加。在所有
False
和为0的情况下,并且在全部为True的情况下,'sum等于列表的长度。
任何其他和值都意味着并非全部为False或True。
csga3l584#
下面是使用生成器表达式的另一种方法:
ar7v8xwq5#
我们都知道
False
也被认为是0
,所以如果所有元素的sum
是0
,这意味着列表中的所有元素都是False
。但既然你想:
返回“false”,因为所有元素都是“false”
为此,请使用求反运算符
not
或!
。