问题描述
我有一个很大的列表,其中包含大量数据。我正在尝试获取该列表中的 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]