在按键分组字典后,获取具有最大值的项目

时间:2012-02-01 14:28:09

标签: python

我有一个如下所示的词典列表:

[{'apples': 99}, {'bananas': '556685'}, {'apples': 88}, {'apples': '2345566'}]

我想按键对项目进行分组并返回具有最高值的项目的键?即总结所有苹果的价值并总结所有香蕉的价值广告返回更高的一个 - 苹果或香蕉我似乎无法找到一个很好的方法这样做,我试图避免使用一堆循环和计数器变量。

(出于好奇,这是否可以作为一个班轮?如果是这样,怎么样?)

3 个答案:

答案 0 :(得分:5)

将所有值更改为整数后:

import itertools as it

a = [{'apples': 99}, {'bananas': 556685}, {'apples': 88}, {'apples': 2345566}]


max((sum(i.values()[0] for i in v), k) for k,v in it.groupby(sorted(a), key=lambda x: x.keys()[0]))[1]

# 'apples'

如果删除尾随[1],它将为您提供总和:

# (2345753, 'apples')

答案 1 :(得分:4)

不完全是单行,但我喜欢使用collections.Counter来完成这类任务,因为我发现它非常易读:

from collections import Counter
from itertools import chain
from operator import itemgetter

a = [{'apples': 99}, {'bananas': 556685}, {'apples': 88}, {'apples': 2345566}]
c = Counter()
for k, v in chain.from_iterable([d.items() for d in a]):
    c[k] += v

print max(c.items(), key=itemgetter(1))[0]

答案 2 :(得分:0)

试试这个:

reduce(lambda m,n:m if int(m[1])>=int(n[1]) else n,map(lambda p:p.items()[0],a))

我想它不会排序,而是给你一行中最高的一个。

相关问题