如何在列表中进行减法运算?

问题描述

我有 3 个列表和 1 个值:

my_value = 500

minimal_values = ['0,32','0,35',45']
maximal_values = ['0,78',85',72']

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

现在我正在过滤我的代码并尝试在 my_value 中对 index [2] - results 进行减法运算。过滤进展顺利,它只是在我的输出中不起作用的减法。代码如下:

# Convert values to float.
minimal_values = [float(i.replace(',','.')) for i in minimal_values]
maximal_values = [float(i.replace(','.')) for i in maximal_values]

# Collect all unique countries in a list.
countries = list(set(country[0] for country in my_list))

results = []
for l in my_list:
    i = countries.index(l[0])
    if minimal_values[i] <= float(l[-1].replace(','.')) <= maximal_values[i]:
        new_index_2 = my_value - float(l[-2].replace(','.'))  #<--- this is where I do the substraction
        results.append(l)
print(results)

这是我得到的输出

[['Morocco',72']]

如您所见,它没有减去 500 - index [2]....

这是我想要的输出

[['Morocco','310,62','311,06',51',44',87','312,05',68',39',72']]

解决方法

您唯一缺少的是在减法后更新列表。

只需在获得 new_index_2 后将此行添加到您的代码中即可。

new_index_2 = my_value - float(l[-2].replace(',','.'))
l[-2] = new_index_2  #update the value back to list
results.append(l)

您仍然可以通过为变量赋予含义全名来提高可读性。

,
results = []
for l in my_list:
    i = countries.index(l[0])
    if minimal_values[i] <= float(l[-1].replace(','.')) <= maximal_values[i]:
        new_index_2 = my_value - float(l[-2].replace(','.'))  #<--- this is where I do the substraction
        new_index_2 = str(new_index_2).replace('.',') # to keep your style
        l[2] = new_index_2 ### !!! Add this line
        results.append(l)
,

这需要一些挖掘,但这可能是处理浮点转换的最干净的方法:

 import locale
 locale._override_localeconv['decimal_point'] = ','
 locale.atof('1,2')
 1.2
 locale.str(1.2)
 '1,2'
,

如前所述,您必须在完成减法后更新列表,但这仍然不会为您提供所需的输出,因为它会偏离一些小数。

你也应该换行

if minimal_values[i] <= float(l[-1].replace(','.')) <= maximal_values[i]:

if minimal_values[i] <= float(l[-1].replace(','.')) and float(l[-1].replace(','.')) <= maximal_values[i]:

通过这两个修改,输出正是您所期望的