【问题标题】:Group dictionary key values in python在python中对字典键值进行分组
【发布时间】:2013-08-13 08:39:07
【问题描述】:

我有以下字典

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' 的总和。

您能对此提出建议吗?

【问题讨论】:

  • 你试过什么?你有什么问题?你能遍历列表中的每个字典吗?你能检查一个键是否存在于字典中吗?
  • 是的,我也可以遍历字典并检查密钥。对于列表中的字典,键“mc_no”的值可以变得相同。我需要的是获得这些相同“mc_no”值的键(“tmst”)值的总和。

标签: python python-2.7 dictionary


【解决方案1】:

你可以使用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"))

【讨论】:

  • 注意:1- 添加mylist.sort(key=itemgetter("mc_no")) 否则groupby() 将不起作用。 2-sum(map(itemgetter("tmst"), group))
【解决方案2】:

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

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)
得到以下结果后... 大 [{'name': 'cow', 'size': 'large'}, {'name': 'pony', 'size':'large'}] 中等 [{'name': 'rabbit', 'size': 'medium'}, {'name': 'squirrel', 'size':'medium'}, {'name': 'fox', 'size' : '中等的'}] 小 [{'name': '鸟', 'size': 'small'}, {'name': 'fish', 'size': 'small'}]

【讨论】:

    【解决方案3】:

    这是一个不需要mylist 按"mc_no" 键排序的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2018-03-15
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多