如何检查混合数据类型列表是否在数值误差范围内一致?
允许数值误差的混合类型列表一致性检查
要解决混合数据类型列表的一致性检查(忽略数值微小误差),可以写一个递归遍历的自定义比较函数,针对不同数据类型做差异化处理:
核心逻辑
- 数字类型(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
相关产品推荐
相关产品推荐

