首页 > 解决方案 > 如何获取列表中最接近的值?

问题描述

我有一个看起来像这样的变量:my_value = 188我有一个看起来像这样的列表:

my_list = [
    ['Morocco', 'Meat', '190,00', '0,15'], 
    ['Morocco', 'Meat', '189,90', '0,32'], 
    ['Morocco', 'Meat', '189,38', '0,44'],
    ['Morocco', 'Meat', '188,94', '0,60'],
    ['Morocco', 'Meat', '188,49', '0,78'],
    ['Morocco', 'Meat', '187,99', '0,101'],
    ['Spain', 'Meat', '190,76', '0,10'], 
    ['Spain', 'Meat', '190,16', '0,20'], 
    ['Spain', 'Meat', '189,56', '0,35'],
    ['Spain', 'Meat', '189,01', '0,40'],
    ['Spain', 'Meat', '188,13', '0,75'],
    ['Spain', 'Meat', '187,95', '0,85'],
    ['Italy', 'Meat', '190,20', '0,11'],
    ['Italy', 'Meat', '190,10', '0,31'], 
    ['Italy', 'Meat', '189,32', '0,45'],
    ['Italy', 'Meat', '188,61', '0,67'],
    ['Italy', 'Meat', '188,01', '0,72'],
    ['Italy', 'Meat', '187,36', '0,80']]

正如您my_list在 index 中看到的数字[2]正在下降,而 index 中的数字[3]正在上升。现在对于每个列表,我想检查哪个索引[3]最接近[2]my_value它不应该低于 my_value。

我尝试了以下代码:

for key,sublists in itertools.groupby(my_list,lambda y:y[0]):
        v=[] #initialize it in case no element fulfill the condition
        for v in itertools.takewhile(lambda x:float(x[-1].replace(",","."))<my_value ,sublists):
            pass
        if v: 
            print(v[-1])

我收到以下输出:

0,101
0,85
0,80

我想要的输出是:

0,78
0,75
0,72

标签: pythonlistmath

解决方案


这是pandas救援工作的类型:

import pandas as pd
my_value = 188
my_list = [] # complete this with your list above

df = pd.DataFrame(my_list) # make a DataFrame out of your list
df[2] = df[2].str.replace(",", ".").astype(float) # convert those strings to actual floats
df[3] = df[3].str.replace(",", ".").astype(float)
selected = df[df[2]>my_value].groupby(by=0).agg({2:'min',3:'last'}) # selects what you want

print(list(selected[3])) # if you just want those values

将输出

[0.72, 0.78, 0.75]

selected看起来像:

0       2       3
Italy   188.01  0.72
Morocco 188.49  0.78
Spain   188.13  0.75

推荐阅读