【问题标题】:Filtering list of tuples using itemgetter and list comp in order to get unique items based on the second item in the tuple使用 itemgetter 和 list comp 过滤元组列表,以便根据元组中的第二项获取唯一项
【发布时间】:2020-10-13 13:44:56
【问题描述】:

我有一个这样的列表:

a = [(1800000.0, 'google'), (1440000.0, 'IBM'), (1260000.0, 'google'), (1008000.0, 'IBM'),
(990000.0, 'google'), (792000.0, 'IBM'), (720000.0, 'FB'), (600000.0, 'google'), 
(504000.0,'FB'), (480000.0, 'IBM'), (420000.0, 'google'), (400000.0, 'google'),
(396000.0, 'FB'), (336000.0, 'IBM'), (330000.0, 'google'), (320000.0, 'IBM'),
(280000.0, 'google'), (264000.0, 'IBM'), (240000.0, 'FB'), (224000.0, 'IBM'),
(220000.0, 'google'), (176000.0, 'IBM'), (168000.0, 'FB'), (160000.0, 'FB'),
(132000.0, 'FB'), (112000.0, 'FB'), (88000.0, 'FB')]

我想使用 itemgetter 获得以下信息。它是每个元组第二项唯一的元组中第一项的最大值:

[(1800000.0, 'google'), (1440000.0, 'IBM'), (720000.0, 'FB')]

我尝试过的:

[max(items) for key, items in groupby(a,key = itemgetter(1))]

但它返回完整列表,虽然它是accepted answer

如何使用 itemgetter 和列表理解实现所需的输出?

【问题讨论】:

  • 您需要按元组中的第二项对a 进行排序,才能正确使用groupby

标签: python list list-comprehension


【解决方案1】:

itertools.groupby 分组连续根据某个键值相等。要使其正常工作,您必须根据第二个字段进行排序。但是对于我们需要的东西,复杂性变得不必要地高。

在这里,您最好使用字典。我们可以将键默认设置为0,如果我们找到更高的值,则更新:

d = {}
for v,k in a:
     if d.setdefault(k, 0) < v:
            d[k] = v

print(d)
{'google': 1800000.0, 'IBM': 1440000.0, 'FB': 720000.0}

获取与上面相同的格式:

[(v,k) for k,v in d.items()]
[(1800000.0, 'google'), (1440000.0, 'IBM'), (720000.0, 'FB')]

【讨论】:

    【解决方案2】:

    groupby() 仅适用于 相邻 类似元素。您需要先按相同的键 (sorted(a, key=itemgetter(1))) 对列表进行排序,如果您希望它使用相同的键捕获和组合 所有 元素:

    [max(items) for _, items in groupby(sorted(a, key=itemgetter(1)), key = itemgetter(1))]
    # [(720000.0, 'FB'), (1440000.0, 'IBM'), (1800000.0, 'google')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多