我有一个如下所示的词典列表:
[{'apples': 99}, {'bananas': '556685'}, {'apples': 88}, {'apples': '2345566'}]
我想按键对项目进行分组并返回具有最高值的项目的键?即总结所有苹果的价值并总结所有香蕉的价值广告返回更高的一个 - 苹果或香蕉我似乎无法找到一个很好的方法这样做,我试图避免使用一堆循环和计数器变量。
(出于好奇,这是否可以作为一个班轮?如果是这样,怎么样?)
答案 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))
我想它不会排序,而是给你一行中最高的一个。