【问题标题】:How to group a list of dicts? [closed]如何对字典列表进行分组? [关闭]
【发布时间】:2017-12-06 17:24:31
【问题描述】:

我有一个字典列表

[
  {"day":"10", "car":"bmw", "count":"3"},
  {"day":"10", "car":"audi", "count":"2"},
  {"day":"10", "car":"jeep", "count":"4"},
  {"day":"11", "car":"bmw", "count":"6"},
  {"day":"11", "car":"audi", "count":"7"},
  {"day":"11", "car":"jeep", "count":"8"},
]

我想把它转换成这样(期望的输出)

[
      {"day":"10", "bmw":"3","audi":"2","jeep":"4"},
      {"day":"11","bmw":"6","audi":"7","jeep":"8"},
]

这就是我所做的。有没有更好和最优的方法来实现这一点。

def dl():
    list_of_dicts = [
            {"day":"10", "car":"bmw", "count":"3"},
            {"day":"10", "car":"audi", "count":"2"},
            {"day":"10", "car":"jeep", "count":"4"},
            {"day":"11", "car":"bmw", "count":"6"},
            {"day":"11", "car":"audi", "count":"7"},
            {"day":"11", "car":"jeep", "count":"8"},
            ]

    result = []
    data = {}

    for item in list_of_dicts:

        if not data.get(item["day"], False):    
            data[item["day"]] = []
            data[item["day"]].append({item["car"]:item["count"]})

        else:
            data[item["day"]].append({item["car"]:item["count"]})

    for key in data:
        new_dict = {}
        new_dict["day"] = key
        for item in data[key]:
            new_dict.update(item)
        result.append(new_dict)

    print result
    return result

dl()

如果问题不正确,请帮助我

纠正这个问题。我是初学者

【问题讨论】:

  • 提供您至少尝试过的代码示例,我们会为您提供帮助。否则你实际上是在要求我们做你的功课。
  • 每当我尝试总结一些东西(在 JavaScript 和/或 Python 中)时,我总是尝试查看 reduce 函数。 (学习 map、reduce 和 filter 函数——它们对于数组/列表操作都很方便)看看这个:book.pythontips.com/en/latest/map_filter.html
  • 您确实需要阅读MCVE documentation。但要回答,请将 reduce 与偏函数一起使用。 from functools import partial, reduce; def f(day, x, y): x.update({y['car']: y['count']}) if y['day'] == day else x; return x; days = {dict_['day'] for dict_ in dict_list}; output = [reduce(partial(f, day), dict_list, {'day': day}) for day in days]
  • 你的意思是它不是初学者提问的平台。它仅供专家使用。 @martineau,
  • 这无疑是一个供初学者就他们编写的代码提出问题的平台。它不是任何人(无论是否是初学者)让其他人为他们工作的平台。这一切都在您注册时显示的教程中得到了清楚的解释。

标签: python python-3.x python-2.7 list dictionary


【解决方案1】:

使用itertools.groupby根据日期分组,然后为每一天创建一个新字典:

list_of_dicts = [
  {"day":"10", "car":"bmw", "count":"3"},
  {"day":"10", "car":"audi", "count":"2"},
  {"day":"10", "car":"jeep", "count":"4"},
  {"day":"11", "car":"bmw", "count":"6"},
  {"day":"11", "car":"audi", "count":"7"},
  {"day":"11", "car":"jeep", "count":"8"},
]

# to use groupby the list must be sorted
list_of_dicts.sort(key=operator.itemgetter("day"))

result_list = []
for day, dicts_for_that_day in itertools.groupby(list_of_dicts, key=operator.itemgetter("day")):
    day_dict = {'day': day}
    day_dict.update({d['car']: d['count'] for d in dicts_for_that_day})
    result_list.append(day_dict)

print(result_list)

【讨论】:

  • 我认为您不需要在这里对列表进行排序
  • @Manjunath 示例列表已经排序,但您确实需要对它们进行排序,否则代码将无法将所有日期组合在一起。
  • @nosklo 非常感谢 looooooooooooooooooot ......我以前不了解 itertools 和操作员。非常感谢。我可以将这种方式用于列表中的 75 个对象吗?会不会有效果
  • 你真的很棒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2018-10-20
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多