【问题标题】:Python - Compare list of lists and pick biggest valuePython - 比较列表并选择最大值
【发布时间】:2017-01-04 19:50:30
【问题描述】:

我有一个列表列表:

l = [['a1', 2], ['a1', 3], ['a1', 1], ['b1', 4], ['b1', 2], ['b1', 6], ['c1', 2]]

我想将每个“子列表”与其他“子列表”进行比较,匹配具有相同索引值的那些 [0] 并保留具有最大索引 [1] 的那些,所以结果是这样的:

resultingList = [['a1', 3], ['b1', 6], ['c1', 2]]

我一直在尝试各种 for 循环和条件语句,但我陷入了困境。

有人可以帮我解决这个问题并让我走上正轨吗?

【问题讨论】:

  • 向我们展示您的尝试
  • 看itertools.groupby()。

标签: python list for-loop compare nested-lists


【解决方案1】:

使用itertools.groupby

from itertools import groupby
l=[['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2]]
l = [max(g, key=lambda x: x[1]) for k, g in groupby(sorted(l), key=lambda x: x[0])]

【讨论】:

  • l 不用排序了,好像已经排序了。如果您对其进行排序,则无需传递 lambda。自然排序在这里工作正常(这是次要的)
  • @Jean-FrançoisFabre 我对此表示怀疑,但我认为无法保证真实数据看起来与测试数据一样好。我不确定“无需传递 lambda”是什么意思。据我了解,groupby 的默认行为是使用身份来生成密钥,所以不会例如将['a1', 1] 和['a1', 2] 分组吗?
  • 我看错了,我以为lambda 在sorted 函数中。我同意。
【解决方案2】:

自然答案是使用itertools.groupby,按子列表的第一个元素分组,然后简单地将max 应用于每个组。由于第一个分组的元素相同,max 自然会根据第二个元素:整数来最大化。

import itertools

l=[['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2]]

print([max(v) for _,v in itertools.groupby(l,lambda x : x[0])])

结果:

[['a1', 3], ['b1', 6], ['c1', 2]]

注意:如果列表没有按照第一个元素值排序,则需要使用sorted(l)而不是l

【讨论】:

    【解决方案3】:

    制作一个字典来保存所有的最大值:

    L = [['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2], ...]
    d = {}
    
    for k,v in L:
        d[k] = max(d.get(k, -float('inf'), v)
    

    【讨论】:

      【解决方案4】:

      您可以将@Patrick Haugh 解决方案中的lambda 表达式替换为operator.itemgetter,如下所示:

      In [18]: from itertools import groupby
      
      In [19]: from operator import itemgetter
      
      In [20]: l = [['b1', 2], ['a1', 2], ['a1', 3], ['c1', 2], ['a1', 1], ['b1', 4], ['b1', 6]]
      
      In [21]: [max(g, key=itemgetter(1)) for _, g in groupby(sorted(l), itemgetter(0))]
      Out[21]: [['a1', 3], ['b1', 6], ['c1', 2]]
      

      【讨论】:

        猜你喜欢
        • 2020-01-27
        • 1970-01-01
        • 2021-11-02
        • 2016-12-19
        • 2017-10-24
        • 2017-04-18
        • 1970-01-01
        • 2020-05-17
        • 2014-09-15
        相关资源
        最近更新 更多