检查列表是空还是仅包含零

时间:2015-12-01 17:50:08

标签: python arrays performance list if-statement

现在,在我的代码中,我有两个列表:aboveAdj1aboveAdj2,它们包含1和0,或者为空:

if len(aboveAdj1) and len(aboveAdj2):
    perAboveFix = 100*int(sum(aboveAdj1) + sum(aboveAdj2))/int(len(aboveAdj1) + len(aboveAdj2))

如果aboveAdj1aboveAdj2都不为空或全为零,那么我想计算比率。是否有一种有效/简短的方法只根据其中一个变量计算比率,如果另一个变量为空,而不必编写一堆if语句?

例如,如果aboveAdj1为空或全为零,则计算:

perAboveFix = 100*int(sum(aboveAdj2))/int(len(aboveAdj2))

,反之亦然。

3 个答案:

答案 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。