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

2024-06-07 10:58:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,其中包含多个示例列表,如下所示:

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

Tags: in示例列表forifismythis
2条回答

这只是一个在列表上迭代并在{}时报告{}的问题

您需要扩展此功能以处理边缘情况(即,如果第一个值超过限制,则会出现错误等)

您可能希望将您的列表拆分为每个商品的一个列表,因为当商品也发生变化时,这将触发

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我们把所有连续的子列表组合在一起,它们在我们指定的位置上具有相同的值,在本例中是第一个位置,然后我们进入这些子列表,取满足我们条件的子列表,并在第一个不满足takewhile的子列表处停止我们只需要最后一个存储在循环末尾的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
>>>    

相关问题 更多 >

    热门问题