繁体   English   中英

如何检查一个列表是否是另一个列表的子集(有容差)

[英]How to check if a list is a subset of another list (with tolerance)

我正在尝试解决一个涉及确定一个列表是否是另一个列表的子集的问题,除了有一个额外的转折,即即使值不完全匹配,代码也应该将列表视为子集,只要它在允许范围内。

例子:

如果我有清单:

A = [0.202, 0.101]
B = [0.1, 0.2, 0.3, 0.4, 0.5]

我设置了tol = 0.002的容差,那么代码应该返回列表A是列表B的子集,因为它的值在容差范围内( 0.202 <= 0.2 + tol0.101 <= 0.1 + tol )。

我没有太多代码要显示,因为我知道如何使用传统的issubset function 确定一个列表是否是另一个列表的子集,但我不确定如何将容差纳入其中。

您可以执行以下操作(首先使用伪代码):

For each elment a of A:
    for each element b of B:
        if a is close enough to b, consider a to be in B
    if a was not close enough to an element in B, break the loop as A is not a subset of B

但请注意,处理浮点数是危险的。 根据这篇文章,我们可以使用decimal模块进行比较。

翻译成简单的 Python 代码:

from decimal import Decimal

for a in A:
    for b in B:
        if abs(Decimal(str(a)) - Decimal(str(b))) <= tol:
            break
    else:
        print('A is not a subset of B')
        break
else:
    print(f"A is a subset of B with a tolerance of {tol}")

现在更紧凑地使用生成器和 function:

def tol_subset(A, B, tol):
    return all(any(abs(Decimal(str(a)) - Decimal(str(b))) <= tol for b in B) for a in A)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM