a=['0.0','123.34'] #list
b=['0.0','123.34']
def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
isclose(a,b)
错误:
TypeError: unsupported operand type(s) for -: 'list' and 'list'
我试图比较 python 中的两个浮点 lists 但得到了错误。如果匹配,否则显示不匹配。任何人都可以帮助我并为我提供另一种方法。
回答1
您的代码中没有 numpy 。
你有 lists 的字符串 - 不是浮点数。您使用的方法对数字而不是字符串进行操作。
(对于浮点数)有一种比较浮点数的现有方法:https://docs.python.org/3/library/math.html#math.isclose
如果要比较 lists,则需要迭代 list。如果要检查浮点数,则需要在检查之前转换为浮点数:
# use what already exists
from math import isclose
a = ['0.0','123.34','42']
b = ['0.0','123.34','3.141']
r = []
# same length lists, use zip to iterate pairwise, use enumerate for index
for idx, (aa, bb) in enumerate(zip(a,b)):
# convert to floats
aaa = float(aa)
bbb = float(bb)
# append if not close
if not isclose(aaa,bbb):
r.append((idx, (aaa,bbb)))
# print results
for w in r:
print("On index {0} we have {1} != {2}".format(w[0],*w[1]), sep="\n")
输出:
On index 2 we have 42.0 != 3.141
回答2
您不能将“-”运算符与 lists 一起使用。代码 abs(a-b)
首先尝试执行 a-b
,因为 a
和 b
是 lists,因此它无法执行此操作。
您可以编写一个函数,从 list a
中的每个对应索引中减去 list b
中的每个索引,并将每次计算的结果放在具有相同索引的新 list 中。
或者使用 numpy 的 numpy.subtract()
方法来执行此计算。
此外,abs()
不能用于 list 对象,您可以编写自己的代码迭代 list 中的每个元素并计算每个元素的绝对 value 或使用 numpy 的 numpy.absolute()
。
回答3
使用 python 您不能相互减去 list 对象。此外,您不能相互减去 str 对象。
你可以用一行来做到这一点:
a=['0.0','123.34'] #list
b=['0.0','123.34']
def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
return all([True if abs(float(i)-float(j)) <= max(rel_tol * max(abs(float(i)), abs(float(j))), abs_tol) else False for i,j in zip(a,b) ])
isclose(a,b)
如果 lists 的两个元素都接近,则返回 True
问候