python - 比较 python 中的两个浮点 list 字符串

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,因为 ab 是 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

问候

相似文章

最新文章