微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用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')]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。