如何在Python

时间:2015-08-31 09:45:22

标签: python django list divide-by-zero

如何在Python中分割2个列表时处理List Comprehensions中的除零异常:

从下面的例子:

from operator import truediv
result_list = map(truediv, [i for i in list1], [j for j in list2])

其中list2可以包含0作为值。

由于我的代码约束,我想在同一行中处理异常。请帮帮我。

3 个答案:

答案 0 :(得分:3)

如果您希望将分区记录为零NaN,那么您可以使用自己的自定义除法功能,如下所示:

import numpy as np

def divide(a, b):
    if b == 0:
        return np.nan
    else: 
        return a/b

list1 = [1, 2, 3]
list2 = [1, 0, 2]
result_list = map(divide, [i for i in list1], [j for j in list2])

答案 1 :(得分:2)

你不能try(compound) statement,列表理解是expression。在Python中,这些是完全不同的东西,你不能在表达式中有一个语句。

你可以做的是使用包装函数:

def add_handler(handler, exc, func):
    def wrapper(*args, **kwargs):

        try:
            return func(*args, **kwargs)
        except exc:
            return handler(*args, **kwargs)    # ???
    return wrapper

然后用作:

my_truediv = add_handler(print, ZeroDivisionError, truediv)

请注意,非常有限。您必须返回一个值并将其插入到结果列表中,您不能简单地“跳过它”。

你应该这样做:

from operator import truediv
result_list = []
for i, j in zip(list1, list2):
    try:
        result_list.append(i/j)
    except ZeroDivisionError:
        pass

或者,如果您只想跳过这些值,则可以将其过滤掉:

map(lambda x_y: truediv(*x_y), filter(lambda x_y: x_y[1] != 0, zip(list1, list2)))

答案 2 :(得分:0)

您可以轻松过滤掉0这样的值,

from operator import truediv
result_list = map(truediv, [i for i in list1], [j for j in list2 if j])