You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查混合数据类型列表是否在数值误差范围内一致?

允许数值误差的混合类型列表一致性检查

要解决混合数据类型列表的一致性检查(忽略数值微小误差),可以写一个递归遍历的自定义比较函数,针对不同数据类型做差异化处理:

核心逻辑

  • 数字类型(int/float):用math.isclose()判断是否在设定的误差范围内,支持自定义相对/绝对误差阈值
  • 列表类型:递归调用比较函数,逐个检查子元素
  • 其他类型(字符串、布尔值等):直接用==严格匹配

代码实现

import math

def compare_with_tolerance(a, b, rel_tol=1e-09, abs_tol=0.0):
    # 处理int和float跨类型的数字比较
    if isinstance(a, (int, float)) and isinstance(b, (int, float)):
        return math.isclose(a, b, rel_tol=rel_tol, abs_tol=abs_tol)
    
    # 类型完全不同时直接返回不匹配(除了上面的数字跨类型情况)
    if type(a) != type(b):
        return False
    
    # 递归检查嵌套列表
    if isinstance(a, list):
        if len(a) != len(b):
            return False
        for elem_a, elem_b in zip(a, b):
            if not compare_with_tolerance(elem_a, elem_b, rel_tol, abs_tol):
                return False
        return True
    
    # 非数字的基础类型严格匹配
    return a == b

使用示例

list1 = [5, "algorithm", [2.71828, 100, [1.0, 0]]]
list2 = [5.000002, "algorithm", [2.718280001, 100.0, [0.999999999, 0]]]

# 执行检查,误差范围内会通过断言
assert compare_with_tolerance(list1, list2), "列表在误差范围内不一致"

# 自定义误差阈值的情况(比如允许更大的相对误差)
assert compare_with_tolerance(list1, list2, rel_tol=1e-5), "列表在自定义误差范围内不一致"

关键说明

  • math.isclose()的rel_tol控制相对误差(默认1e-9,即十亿分之一级的误差),abs_tol控制绝对误差,可根据业务需求调整
  • 支持任意层级的嵌套列表检查,无需额外处理
  • 非数字类型(如字符串)保持严格匹配,避免误判

内容的提问来源于stack exchange,提问作者user7585848

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:12:08