现在,在我的代码中,我有两个列表:aboveAdj1
和aboveAdj2
,它们包含1和0,或者为空:
if len(aboveAdj1) and len(aboveAdj2):
perAboveFix = 100*int(sum(aboveAdj1) + sum(aboveAdj2))/int(len(aboveAdj1) + len(aboveAdj2))
如果aboveAdj1
和aboveAdj2
都不为空或全为零,那么我想计算比率。是否有一种有效/简短的方法只根据其中一个变量计算比率,如果另一个变量为空,而不必编写一堆if
语句?
例如,如果aboveAdj1
为空或全为零,则计算:
perAboveFix = 100*int(sum(aboveAdj2))/int(len(aboveAdj2))
,反之亦然。
答案 0 :(得分:4)
基本上你想检查一下:
any()
函数只是为您执行此操作,因为如果列表不为空且包含至少一个非零值,则any(some_list)
为True
。
因此,如果您只想在两个列表都有效时计算比率,您可以这样做:
if any(aboveAdj1) and any(aboveAdj2):
perAboveFix = 100 * (sum(aboveAdj1) + sum(aboveAdj2)) / (len(aboveAdj1) + len(aboveAdj2))
否则,如果您想在至少一个列表有效时计算它,那么您可以这样做:
if any(aboveAdj1 + aboveAdj2):
perAboveFix = 100 * (sum(aboveAdj1) + sum(aboveAdj2)) / (len(aboveAdj1) + len(aboveAdj2))
另请注意,您不需要使用int()
功能,因为正如您所说,您的列表只包含0
和{{1 }}和1
已经返回整数值。
答案 1 :(得分:3)
如果您正在测试的唯一选项是上面的Adj1是空的,或者上面的Adj1是用零填充的,那么你可以这样做
if sum(aboveAdj1):
# some non-zero element exists
do_stuff_as_normal
else:
do_stuff_differently
空列表或填充零的列表的总和为0
,这是假的。
或者,如果你只是害怕零分割,你可以跳过所有的条件并简单地尝试它,除了你可能除以零的情况。这是Python中常见的习语。
try:
your_normal_division
except ZeroDivisonError:
alternate_formula
答案 2 :(得分:0)
空列表的sum
和零列表将返回0,这意味着如果aboveAdj1 == ([] or [0,0,0]
则sum(aboveAdj1) + sum(aboveAdj2) == sum(aboveAdj2)
。这意味着您唯一需要担心的是零列表的len
(即,[0,0,0]
应返回len == 0
)。你可以用三元表达式来处理这个问题:
perAboveFix = 100*int(sum(aboveAdj1) + sum(aboveAdj2))/ #just a break for readability
int((len(aboveAdj1) if sum(aboveAdj1) else 0) +
(len(aboveAdj2) if sum(aboveAdj2) else 0))
^ ^ checks that sum is not 0
然后,您需要检查的是,至少有一个列表具有有效长度,因为除以0是数学错误。通过使用内置的any
函数,您可以同时检查长度和总和:
if any(aboveAdj1) or any(aboveAdj2):
#expression here
因为any
如果所有元素都为0或者为空,则返回false。