Python 如何获取列表中最接近的值?

Python 如何获取列表中最接近的值?,python,list,math,Python,List,Math,我有一个如下的变量: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,4

我有一个如下的变量: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']]
[(2.0, '0,15'),
 (1.9000000000000057, '0,32'),
 (1.3799999999999955, '0,44'),
 (0.9399999999999977, '0,60'),
 (0.4900000000000091, '0,78'),
 (2.759999999999991, '0,10'),
 (2.1599999999999966, '0,20'),
 (1.5600000000000023, '0,35'),
 (1.009999999999991, '0,40'),
 (0.12999999999999545, '0,75'),
 (2.1999999999999886, '0,11'),
 (2.0999999999999943, '0,31'),
 (1.3199999999999932, '0,45'),
 (0.6100000000000136, '0,67'),
 (0.009999999999990905, '0,72')]
正如您在my_列表中看到的,索引[2]中的数字在下降,而索引[3]中的数字在上升。现在,对于每个列表,我想检查索引[3]与我的_值最接近的是哪个索引[2],但它不应该低于我的_值

我尝试了以下代码:

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,78
0,75
0,72
首先,我创建了一个列表编号,它保存了我的_列表中每个列表的索引2的值,这些值被转换为浮点值,因此我们实际上能够对这些编号执行计算。这是使用列表理解完成的

然后我创建一个新的列表极小值,在这里我计算我的_值和所有数字值之间的差值,条件是数字中的值必须大于或等于我的_值。通过使用zipnumber,我的_列表同时循环列表编号和我的_列表,这样我就可以将difference num-myvalue与我的_列表的索引3中的相应值组合成一个元组

列表最小值如下所示:

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']]
[(2.0, '0,15'),
 (1.9000000000000057, '0,32'),
 (1.3799999999999955, '0,44'),
 (0.9399999999999977, '0,60'),
 (0.4900000000000091, '0,78'),
 (2.759999999999991, '0,10'),
 (2.1599999999999966, '0,20'),
 (1.5600000000000023, '0,35'),
 (1.009999999999991, '0,40'),
 (0.12999999999999545, '0,75'),
 (2.1999999999999886, '0,11'),
 (2.0999999999999943, '0,31'),
 (1.3199999999999932, '0,45'),
 (0.6100000000000136, '0,67'),
 (0.009999999999990905, '0,72')]
然后,我根据元组中的第一个值,即my_值和索引3中的数字之间的差值,按升序对该列表进行排序。然后取前三个,只返回元组中的第二个值

顺便说一句:如果您正在处理这样的表格数据,那么查看pandas库可能是一个好主意。这篇帖子上的另一个答案展示了一种处理熊猫的方法。使用该库处理表格数据通常更容易、更友好,因为它提供了许多功能,可以轻松地执行大量数据操作和分析

首先,我创建了一个列表编号,它保存了我的_列表中每个列表的索引2的值,这些值被转换为浮点值,因此我们实际上能够对这些编号执行计算。这是使用列表理解完成的

然后我创建一个新的列表极小值,在这里我计算我的_值和所有数字值之间的差值,条件是数字中的值必须大于或等于我的_值。通过使用zipnumber,我的_列表同时循环列表编号和我的_列表,这样我就可以将difference num-myvalue与我的_列表的索引3中的相应值组合成一个元组

列表最小值如下所示:

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']]
[(2.0, '0,15'),
 (1.9000000000000057, '0,32'),
 (1.3799999999999955, '0,44'),
 (0.9399999999999977, '0,60'),
 (0.4900000000000091, '0,78'),
 (2.759999999999991, '0,10'),
 (2.1599999999999966, '0,20'),
 (1.5600000000000023, '0,35'),
 (1.009999999999991, '0,40'),
 (0.12999999999999545, '0,75'),
 (2.1999999999999886, '0,11'),
 (2.0999999999999943, '0,31'),
 (1.3199999999999932, '0,45'),
 (0.6100000000000136, '0,67'),
 (0.009999999999990905, '0,72')]
然后,我根据元组中的第一个值,即my_值和索引3中的数字之间的差值,按升序对该列表进行排序。然后取前三个,只返回元组中的第二个值


顺便说一句:如果您正在处理这样的表格数据,那么查看pandas库可能是一个好主意。这篇帖子上的另一个答案展示了一种处理熊猫的方法。使用该库处理表格数据通常更容易、更友好,因为它提供了许多功能,可以轻松执行大量数据操作和分析。

为什么不使用内置排序?:


my_list = [row for row in my_list if float(row[2].replace(',','.')) >= my_value]
my_list.sort(key=lambda l:float(l[2].replace(',','.')))

for row in my_list:
    print(row)
>


为什么不使用内置排序


my_list = [row for row in my_list if float(row[2].replace(',','.')) >= my_value]
my_list.sort(key=lambda l:float(l[2].replace(',','.')))

for row in my_list:
    print(row)
>


这就是大熊猫来营救的工作:

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]

选定的将如下所示:

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

这就是大熊猫来营救的工作:

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]

选定的将如下所示:

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

你说超越你的价值是什么意思?在您的示例所需输出中,索引2处的值都大于188,因此高于您的值。你的意思是他们不应该低于你的价值吗?@sunnytown with suppression我的意思是,我只是想澄清这是否真的是你的意思。你说的超越你的价值是什么意思?在您的示例所需输出中,索引2处的值都大于188,因此高于您的值。你的意思是他们不应该低于你的价值吗?@sunnytown with suppression我的意思是,我只是想澄清这是否真的是你的意思。你的前三名给出了正确的输出。你能详细解释一下你到底做了什么吗?我已经对我的文章进行了编辑并给出了解释。@TangerCity你确定这会给出正确的结果吗?它似乎只是碰巧给出了正确的输出,因为每个国家的值恰好在相似的范围内。哦,我可能实际上误解了这个问题。这可能是真的,因为我不按国家分组,所以它不会总是给出正确的输出。很抱歉。@sunnytown您如何按国家添加分组?您的top3给出了正确的输出。你能详细解释一下你到底做了什么吗?我已经对我的文章进行了编辑并给出了解释。@TangerCity你确定这会给出正确的结果吗?它似乎只是碰巧给出了正确的输出,因为每个国家的值恰好在相似的范围内。哦,我可能实际上误解了这个问题。这可能是真的,它不会总是给出正确的答案
输出,因为我不按国家分组。很抱歉。@sunnytown如何按国家添加分组?