【问题标题】:How to handle the divide by zero exception in List Comprehensions while dividing 2 lists in Python如何在 Python 中划分 2 个列表时在列表理解中处理除以零异常
【发布时间】:2015-11-25 07:35:16
【问题描述】:

如何在 Python 中划分 2 个列表时在列表理解中处理除以零异常:

从下面的例子:

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

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

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

【问题讨论】:

    标签: python django list divide-by-zero


    【解决方案1】:

    你不能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】:

      如果您想将除以零记录为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])
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 您也需要从list1 中删除相应的值,否则这些值就会不同步。
        猜你喜欢
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 1970-01-01
        • 2015-05-18
        相关资源
        最近更新 更多