Python 在元组列表中找到最接近的浮点值

Python find float nearest value in list of tuple

我有一个值 total_weight = 212.0,我的程序中有一部分试图找到准确的值,但我的列表中没有准确的权重。

所以我想得到最接近的值。在此示例中,它将是 [(200.0, (2.5, 5.0, 10.0, 15.0, 45.0)), (200.0, (2.5, 5.0, 10.0, 25.0, 35.0)), (220.0, (2.5, 5.0, 10.0, 25.0, 45.0))]

List = [ (180.0, (2.5, 5.0, 10.0, 15.0, 35.0)), (200.0, (2.5, 5.0, 10.0, 15.0, 45.0)), (200.0, (2.5, 5.0, 10.0, 25.0, 35.0)), (220.0, (2.5, 5.0, 10.0, 25.0, 45.0)), (240.0, (2.5, 5.0, 10.0, 35.0, 45.0)), (210.0, (2.5, 5.0, 15.0, 25.0, 35.0)), (230.0, (2.5, 5.0, 15.0, 25.0, 45.0)), (250.0, (2.5, 5.0, 15.0, 35.0, 45.0)), (270.0, (2.5, 5.0, 25.0, 35.0, 45.0)), (220.0, (2.5, 10.0, 15.0, 25.0, 35.0)), (240.0, (2.5, 10.0, 15.0, 25.0, 45.0)), (260.0, (2.5, 10.0, 15.0, 35.0, 45.0)), (280.0, (2.5, 10.0, 25.0, 35.0, 45.0)), (290.0, (2.5, 15.0, 25.0, 35.0, 45.0)), (225.0, (5.0, 10.0, 15.0, 25.0, 35.0)), (245.0, (5.0, 10.0, 15.0, 25.0, 45.0)), (265.0, (5.0, 10.0, 15.0, 35.0, 45.0)))]

我试过使用 min() 但我没能成功。

要找到最近的值,请将 minkey 函数一起使用,该函数给出与目标的距离:

>>> weights = [
    (180.0, (2.5, 5.0, 10.0, 15.0, 35.0)), 
    (200.0, (2.5, 5.0, 10.0, 15.0, 45.0)), 
    (200.0, (2.5, 5.0, 10.0, 25.0, 35.0)), 
    (220.0, (2.5, 5.0, 10.0, 25.0, 45.0)), 
    (240.0, (2.5, 5.0, 10.0, 35.0, 45.0)), 
    (210.0, (2.5, 5.0, 15.0, 25.0, 35.0)), 
    (230.0, (2.5, 5.0, 15.0, 25.0, 45.0)), 
    (250.0, (2.5, 5.0, 15.0, 35.0, 45.0)), 
    (270.0, (2.5, 5.0, 25.0, 35.0, 45.0)), 
    (220.0, (2.5, 10.0, 15.0, 25.0, 35.0)), 
    (240.0, (2.5, 10.0, 15.0, 25.0, 45.0)), 
    (260.0, (2.5, 10.0, 15.0, 35.0, 45.0)), 
    (280.0, (2.5, 10.0, 25.0, 35.0, 45.0)), 
    (290.0, (2.5, 15.0, 25.0, 35.0, 45.0)), 
    (225.0, (5.0, 10.0, 15.0, 25.0, 35.0)), 
    (245.0, (5.0, 10.0, 15.0, 25.0, 45.0)), 
    (265.0, (5.0, 10.0, 15.0, 35.0, 45.0)),
]
>>> total_weight = 212.0
>>> min(weights, key=lambda w: abs(w[0] - total_weight))
(210.0, (2.5, 5.0, 15.0, 25.0, 35.0))

要找到较高值和较低值,排序并找到第一个较高值的索引,然后取它和前一个:

>>> weights.sort()
>>> higher = next(i for i in range(len(weights)) if weights[i][0] > total_weight)
>>> weights[higher-1:higher+1]
[(210.0, (2.5, 5.0, 15.0, 25.0, 35.0)), (220.0, (2.5, 5.0, 10.0, 25.0, 45.0))]

(处理边缘情况会增加更多的复杂性——如果 完全匹配怎么办?如果目标高于或低于所有值怎么办?等等)