【问题标题】:Preventing dividing by zero in list comprehensions防止在列表推导中除以零
【发布时间】:2013-06-21 12:43:01
【问题描述】:

我有以下代码:

scores = [matrix[i][i] / sum(matrix[i]) for (i, scores) in enumerate(matrix)]

我的问题是 sum(matrix[i]) 在某些情况下可能为 0,导致 ZeroDivisionError。但是因为matrix[i][i]在那种情况下也是0,所以我解决了这个问题:

scores = [divide(matrix[i][i], sum(matrix[i])) for (i, scores) in enumerate(matrix)]

如果y == 0(x / y) 如果y > 0,函数divide(x, y) 返回1。但我想知道是否有更简单的方法。也许我可以使用一些三元运算符,但这在 Python 中存在吗?

【问题讨论】:

    标签: python list-comprehension divide-by-zero


    【解决方案1】:

    是的,在 Python 中它被称为conditional expression

    [matrix[i][i] / sum(matrix[i]) if sum(matrix[i]) != 0 else 0 
     for (i, scores) in enumerate(matrix)]
    

    【讨论】:

    • 但这会让sum计算两次。
    • @ovgolovin 很遗憾,但它仍然是一个解决方案:3
    • 是的,毫无疑问这是一个解决方案。为此+1。我只是想知道是否可以在列表理解中重用sum 的结果。
    • 那么,建议的解决方案更快?
    • @Lewistrick 取决于您如何实现divide。如果它计算了两次sum,它并没有更快。
    【解决方案2】:
    [(lambda x, y: 0 if y == 0 else x/y)(row[i], sum(row))
     for i, row in enumerate(matrix)]
    

    【讨论】:

      【解决方案3】:

      确实存在三元条件:

      'blah' if True else 'wee'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 2021-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多