【问题标题】:Python find float nearest value in list of tuplePython在元组列表中找到浮点最近的值
【发布时间】:2021-09-20 16:42:20
【问题描述】:

我有一个值 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() 但我无法让它工作。

【问题讨论】:

  • 最近的 value 还是最近的 values?看起来您想要一个第一个元素最接近 total_weight 的元组列表。
  • 最近的值。我想要最接近的上限和下限。抱歉,不清楚。
  • 请澄清你的例子。 “它”是示例输入还是输出?你和total_weight比较的是什么值?

标签: python python-3.x list tuples


【解决方案1】:

要找到最接近的值,请使用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))]

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

【讨论】:

  • 非常感谢!至于边缘情况,我已经在我的程序中处理了它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
相关资源
最近更新 更多