如何处理在两个序列中哈希值时的零除错?

1 投票
4 回答
2935 浏览
提问于 2025-04-16 17:19

我有两个固定长度的元组列表。这个函数用来计算对应元素的比值(比例),注意,这里为了让代码更易读,fX()没有使用列表推导。

>>> def fX(a,b):  
>>>    c=[]  
>>>    for i in range(len(a)):  
>>>        c.append([a[i][x]/float(a[i][x]+b[i][x]) for x in range(len(a[i]))])
>>>    return c  

当所有的值都不为零时,fX()可以正常工作:

>>> a[0]=(3, 4, 17, 9.6667, 6.6583, 0.4310, 1)  
>>> b[0]=(4, 4, 12, 8.0, 3.2660, 0.0002, 1)  
>>> fX(a,b)  
>>> [[0.4286, 0.5, 0.5862, 0.5472, 0.6710, 0.9995, 0.5]]  

但是,当任何一对的值加起来为零时,fX()就会出问题:

>>> a[0]=(3, 4, 17, 9.6667, 6.6583, 0.4310, 0)  
>>> b[0]=(4, 4, 12, 8.0, 3.2660, 0.0002, 0)  
>>> fX(a,b)  
Traceback (most recent call last):  
  File "<pyshell#59>", line 1, in <module>  
    fX(a,b)  
  File "<pyshell#52>", line 4, in fX  
    c.append([a[i][x]/float(a[i][x]+b[i][x]) for x in range(len(a[i]))])  
ZeroDivisionError: float division  

我需要一个函数,fY(),它能在不逐个测试每个值的情况下,给出我想要的结果:

>>> a[i]=(3, 4, 17, 9.6667, 6.6583, 0.4310, 0)  
>>> b[i]=(4, 4, 12, 8.0, 3.2660, 0.0002, 0)  
>>> fY()  
>>> [[0.4286, 0.5, 0.5862, 0.5472, 0.6710, 0.9995, 0.0]]  

谢谢。

4 个回答

0

如果你想在Python中实现这个功能,唯一的方法就是对每个元素进行测试。需要注意的是,这样做并不会增加你的运行时间,而且其实开销很小。这根本不是“暴力破解”。

如果你特别在意语法,而对速度完全不在乎,你可以把每个数字放在自己定义的 MyNumber 类里,并为除法设置一些特殊规则。当然,这样做会导致性能非常差。

你也可以把计算放在一个 try...except 语句中,如果出现异常就返回 float('nan'),但这其实和“对每个值进行测试”是一样的。即使是语言内置的功能,如果这样做,也相当于在“背后进行测试”。

4
def f_cell(a, b):
    try: return a / float(a + b) # EAFP
    except: return 0.0 # Or whatever other value you want for this case.

def fY(a,b):  
    return [
        [f_cell(a_cell, b_cell) for a_cell, b_cell in zip(a_row, b_row)]
        for a_row, b_row in zip(a, b)
    ]

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

3

使用 a if x else b 这个三元运算符(它和 C/C++/Java 中的 x ? a : b 是一样的)可以把条件放在列表推导式里面。这样做可以让你的代码既高效又符合 Python 的风格:

def fY(a, b):
    return [[aij/float(aij + bij) if aij+bij != 0 else 0 for aij, bij in zip(ai, bi)]
            for ai, bi in zip(a, b)]

撰写回答