如何处理在两个序列中哈希值时的零除错?
我有两个固定长度的元组列表。这个函数用来计算对应元素的比值(比例),注意,这里为了让代码更易读,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)]