使用itemgetter和list comp过滤元组列表,以便基于元组中的第二个项目获得唯一项

问题描述

我有一个这样的列表:

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

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

[(1800000.0,'FB')]

我尝试过的事情:

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

但是它返回完整列表,尽管它是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 相似的元素。如果您希望列表捕获并组合具有相同键的 all 元素,则需要先按相同的键(sorted(a,key=itemgetter(1)))对列表进行排序:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...