问题描述
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')]