在Python中对字典键值进行分组

18

我有以下字典

mylist = [{'tpdt': '0.00', 'tmst': 45.0, 'tmdt': 45.0, 'pbc': 30, 'remarks': False, 'shift': 1, 'ebct': '0.00', 'tmcdt': '0.00', 'mc_no': 'KA20'}, 
          {'tpdt': '0.00', 'tmst': 45.0, 'tmdt': 45.0, 'pbc': 30, 'remarks': False, 'shift': 1, 'ebct': '0.00', 'tmcdt': '0.00', 'mc_no': 'KA20'}, 
          {'tpdt': '0.00', 'tmst': 55.0, 'tmdt': 55.0, 'pbc': 30, 'remarks': False, 'shift': 1, 'ebct': '0.00', 'tmcdt': '0.00', 'mc_no': 'KA23'}, 
          {'tpdt': '0.00', 'tmst': 55.0, 'tmdt': 55.0, 'pbc': 30, 'remarks': False, 'shift': 1, 'ebct': '0.00', 'tmcdt': '0.00', 'mc_no': 'KA23'}]

我想获取字典列表中所有键为'KA20'和'KA23'的字典值中键为'tmst'的总和。

您能提供建议吗?


1
你尝试过什么?你遇到了什么问题?你能循环遍历列表中的每个字典吗?你能检查一个字典中是否存在某个键吗? - John Lyon
是的,我可以循环遍历字典并检查键。在列表中,键“mc_no”的值可能会变得相同。我需要做的是获取这些相同“mc_no”值的键('tmst')值的总和。 - Alchemist777
3个回答

30

你可以使用 itertools.groupby

>>> for key, group in itertools.groupby(mylist, lambda item: item["mc_no"]):
...     print key, sum([item["tmst"] for item in group])
... 
KA20 90.0
KA23 110.0

请注意,为了使groupby正常工作,mylist必须按照分组键进行排序:

from operator import itemgetter

mylist.sort(key=itemgetter("mc_no"))

4
注意:1- 添加mylist.sort(key=itemgetter("mc_no")),否则 groupby() 无法正常工作。2- sum(map(itemgetter("tmst"), group))。 注:本翻译仅供参考,具体语言上下文和场景需要根据实际情况进行调整。 - jfs

8

首先,您需要使用以下代码对字典列表进行排序。

例如:

animals = [{'name':'cow', 'size':'large'},{'name':'bird', 'size':'small'},{'name':'fish', 'size':'small'},{'name':'rabbit', 'size':'medium'},{'name':'pony', 'size':'large'},{'name':'squirrel', 'size':'medium'},{'name':'fox', 'size':'medium'}]

import itertools
from operator import itemgetter
sorted_animals = sorted(animals, key=itemgetter('size'))

然后您可以使用以下代码。
for key, group in itertools.groupby(sorted_animals, key=lambda x:x['size']):
    print key,
    print list(group)
大型 [{'名称': '牛', '大小': '大'}, {'名称': '马', '大小': '大'}]
中型 [{'名称': '兔子', '大小': '中'}, {'名称': '松鼠', '大小': '中'}, {'名称': '狐狸', '大小': '中'}]
小型 [{'名称': '鸟', '大小': '小'}, {'名称': '鱼', '大小': '小'}]

2
这里有一段代码,它不需要按照“mc_no”键对“mylist”进行排序:

from collections import defaultdict

sums = defaultdict(int)  # key -> sum
for d in mylist:
    sums[d["mc_no"]] += d["tmst"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接