如何获取列表中倒数第二个值



我有一个列表,里面包含多个列表,看起来像这样:

my_list = [
['Morocco', 'Fish', '0,012'], 
['Morocco', 'Fish', '0,153'], 
['Morocco', 'Fish', '0,114'],
['Morocco', 'Fish', '0,109'],
['Morocco', 'Fish', '0,252'],
['Spain', 'Fish', '0,012'], 
['Spain', 'Fish', '0,113'], 
['Spain', 'Fish', '0,116'],
['Spain', 'Fish', '0,250'],
['Spain', 'Fish', '0,266'],
['Italy', 'Fish', '0,112'], 
['Italy', 'Fish', '0,025'], 
['Italy', 'Fish', '0,224'],
['Italy', 'Fish', '0,256'],
['Italy', 'Fish', '0,245']]

我有一个变量,看起来像这样:

my_limit = 0.2

现在,对于每个列表,我都想在它超过my_limit之前获得最后一个值。我希望将该值存储在一个新变量中。

这就是我尝试的:

for l in my_list:
if row[-1]  #<-- this is actually where I block.... I dont know how to fix it.

这是我期望的输出:

0,109
0,116
0,025

这只是在列表上迭代并在list[n]>my_limit时报告list[n-1]的问题。

你需要扩展它来处理边缘情况(即,如果第一个值超过限制等,这将出错(

你可能想把你的清单分成每个商品的一个清单,因为当商品也发生变化时,这会触发。

my_limit = 0.2
for n in range(1, len(my_list)):
value = float(my_list[n][2].replace(",", "."))
prev_value = float(my_list[n-1][2].replace(",", "."))
if value > my_limit and prev_value < my_limit:
print(my_list[n-1])

您可以将itertools模块用于此

>>> import itertools
>>> my_list = [
['Morocco', 'Fish', '0,012'],
['Morocco', 'Fish', '0,153'],
['Morocco', 'Fish', '0,114'],
['Morocco', 'Fish', '0,109'],
['Morocco', 'Fish', '0,252'],
['Spain', 'Fish', '0,012'],
['Spain', 'Fish', '0,113'],
['Spain', 'Fish', '0,116'],
['Spain', 'Fish', '0,250'],
['Spain', 'Fish', '0,266'],
['Italy', 'Fish', '0,112'],
['Italy', 'Fish', '0,025'],
['Italy', 'Fish', '0,224'],
['Italy', 'Fish', '0,256'],
['Italy', 'Fish', '0,245']]
>>> my_limit = 0.2
>>> for key,sublists in itertools.groupby(my_list,lambda y:y[0]):
v=[] #we initialize it in case no element fulfill the condition
for v in itertools.takewhile(lambda x:float(x[-1].replace(",","."))<my_limit ,sublists):
pass
if v: 
print(v,"->",v[-1])

['Morocco', 'Fish', '0,109'] -> 0,109
['Spain', 'Fish', '0,116'] -> 0,116
['Italy', 'Fish', '0,025'] -> 0,025
>>> 

在这里,使用groupby,我们将所有连续的子列表分组在一起,这些子列表在我们指定的给定位置具有相同的值,在这种情况下是第一个位置,然后我们进入这些子列表,取那些满足我们条件的子列表,并在第一个不符合takewile的子列表处停止,从中我们只想要最后一个,它将在循环结束时存储到v中。

我之所以进行分组,是因为这对我来说更有意义,但如果没有必要进行这样的分组,我们也可以使用groupby通过更改分组密钥将列表拆分为满足条件的子部分和不满足条件的部分

>>> my_list = [
['Morocco', 'Fish', '0,012'],
['Morocco', 'Fish', '0,153'],
['Morocco', 'Fish', '0,114'],
['Morocco', 'Fish', '0,109'],
['Morocco', 'Fish', '0,252'],
['Morocco', 'Fish', '0,002'],#extra
['Morocco', 'Fish', '0,252'],#extra
['Spain', 'Fish', '0,012'],
['Spain', 'Fish', '0,113'],
['Spain', 'Fish', '0,116'],
['Spain', 'Fish', '0,250'],
['Spain', 'Fish', '0,266'],
['Spain', 'Fish', '0,066'], #extra
['Spain', 'Fish', '0,366'], #extra
['Italy', 'Fish', '0,112'],
['Italy', 'Fish', '0,025'],
['Italy', 'Fish', '0,224'],
['Italy', 'Fish', '0,256'],
['Italy', 'Fish', '0,245'],
['Italy', 'Fish', '0,005'],#extra
['Italy', 'Fish', '0,305']]#extra
>>> for condition,sublist in itertools.groupby(my_list,lambda x:float(x[-1].replace(",","."))<my_limit):
if condition:
for v in sublist:
pass
print(v,"->",v[-1])

['Morocco', 'Fish', '0,109'] -> 0,109
['Morocco', 'Fish', '0,002'] -> 0,002
['Spain', 'Fish', '0,116'] -> 0,116
['Spain', 'Fish', '0,066'] -> 0,066
['Italy', 'Fish', '0,025'] -> 0,025
['Italy', 'Fish', '0,005'] -> 0,005
>>>    

最新更新