使用 itemgetter 和 list comp 过滤元组列表,以便根据元组中的第二项获取唯一项

Filtering list of tuples using itemgetter and list comp in order to get unique items based on the second item in the tuple

我有一个这样的列表:

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))]

但它是 returns 完整列表,尽管它是 accepted answer

如何使用带有列表理解的 itemgetter 获得所需的输出?

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')]

groupby() 仅适用于 adjacent 相似元素。您需要先按相同的键 (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')]