如何获得最接近列表的值?

问题描述

我有一个很大的列表,其中包含大量数据。我正在尝试获取该列表中的 min x[-2],如果它是 >= limit

这是我的清单:enter link description here

这是我的代码

limit = 45.7

ls_list = []
for key,sublists in itertools.groupby(my_list,lambda y:y[0]): 
    v = min(x for x in sublists if float(x[5].replace(',','.')) >= limit);
    ls_list.append(v[-2])

print(ls_list)

这是我的输出

[137.332]

如果您查看 my_list,您可以看到 45,705 中的 x[5] 应该 实际上是 min(>= limit) 所以它应该抓取该行中的 x[-2] 。现在它抓取了整个列表的 x[-2]...

预期输出为:

[148.419] 

请注意,我使用 groupby 函数是因为最初 my_list 还包含来自 C150,C151,C152 等的值...

解决方法

现在 min 函数从 x[0] 开始对列表进行排序。假设你有一个列表:

a = [['a','x','r',5,1],['a',2,3],4,5],3,6]]

因此,如果您运行 min(a),它将给出 a[1],因为所有 sublists 中的所有元素在第 4 个元素之前都相等,因此 min 基于此元素.

在您的情况下,由于索引 0、1、2 和 3 处的子列表的所有元素完全相同,这就是 min 返回在第 4 个索引中具有最小值的列表的原因。事实证明这是 my_list 中的最后一个子列表。

试试这个:

v = min((x for x in sublists if float(x[5].replace(',','.')) >= limit),key=lambda x: x[-1])

上面这行的 key=lambda... 函数会做的是,它会强制 min 根据每个子列表的最后一个元素找到最小值。

或者您也可以只采用您想要计算最小值的预期值,即:

v = min(x[-1] for x in sublists if float(x[5].replace(','.') >= limit)

但这将附加来自 x[5] 或 x[-1] 而不是来自 x[-2] 的值。上述使用 lambda 的方法将给出预期的输出。

,
limit = 45.7
import math
[i[4]  for i in my_list if math.isclose(float(i[5].replace(','.')),limit,rel_tol=0.001)]

您可以使用具有 math 方法的 isclose() 模块

math.isclose(a,b,*,rel_tol=1e-09,abs_tol=0.0)

如果值 a 和 b 彼此接近,则返回 True 并且返回 False 否则。

是否认为两个值接近是根据 给定绝对和相对公差。

rel_tol 是相对容差——它是允许的最大值 a 和 b 之间的差值,相对于 a 的较大绝对值 或 B.例如,要设置 5% 的容差,通过 rel_tol=0.05

输出:

[148.419]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...