【问题标题】:How to group and add a count attribute to a list of dictionaries in python?如何对python中的字典列表进行分组和添加计数属性?
【发布时间】:2015-04-02 09:47:18
【问题描述】:

给定一个字典列表:

list = [{"foo": "a", "bar": "1", "baz": "A_CODE"}, 
        {"foo": "a", "bar": "12", "baz": "A_CODE"}, 
        {"foo": "b", "bar": "2", "baz": "ANOTHER_CODE"}]

通过基于baz 对字典进行分组来获得以下内容的最优雅方法是什么? bar 可以省略。

items = [{"foo": "a", "baz": "A_CODE", "count": 2},  
        {"foo": "b", "baz": "ANOTHER_CODE", "count": 1}]

这是我现在的做法:

items = []
for key, group in itertools.groupby(list, lambda item: item["baz"]):
    item["count"] = sum([1 for item in group])
    items.append(item)

【问题讨论】:

  • bar 键发生了什么事?字典按什么标准分组?字典是否按其选择标准排序?
  • 请查看编辑。抱歉缩进。
  • 我还是没看到 bar 发生了什么
  • 那么bar 键呢?那么顺序呢,输入列表总是按baz排序的吗?你自己有没有尝试过?
  • 列表未排序。请查看我所做的编辑。谢谢

标签: python list dictionary count


【解决方案1】:

您没有提供太多信息,希望这可以帮助您解决问题。

from collections import defaultdict

d = defaultdict(int)
for i in list:
    d[i["baz"]]+=1
>>[{"baz":i, "count":j} for i,j in d.items()]
 [{'baz': 'A_CODE', 'count': 2}, {'baz': 'ANOTHER_CODE', 'count': 1}]

【讨论】:

  • 我不知道defaultdict,谢谢。你认为它比我使用groupby 的方式更好吗?
  • @mickael: groupby 要求对输入进行排序。这就是为什么我询问输入在选择键上排序的原因;在这种情况下,必须先排序使groupby 成为一个较差的选择。
  • @MartijnPieters 理解。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2017-05-15
  • 2013-08-06
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多