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() 但我没能成功。
要找到最近的值,请将 min
与 key
函数一起使用,该函数给出与目标的距离:
>>> 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))]
(处理边缘情况会增加更多的复杂性——如果 是 完全匹配怎么办?如果目标高于或低于所有值怎么办?等等)
我有一个值 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() 但我没能成功。
要找到最近的值,请将 min
与 key
函数一起使用,该函数给出与目标的距离:
>>> 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))]
(处理边缘情况会增加更多的复杂性——如果 是 完全匹配怎么办?如果目标高于或低于所有值怎么办?等等)