python:匹配dicts列表的列表

时间:2016-10-03 02:07:02

标签: python

我有几个像:

a = [ { 'event_id': 1}, { 'event_id': 1}, { 'event_id': 1}, { 'event_id': 2}, { 'event_id': 2}, { 'event_id': 3} ]

我想要一个列表列表,每个子列表包含所有具有相似event_id值的词组:

[ [ { 'event_id': 1}, { 'event_id': 1}, { 'event_id': 1} ], [ { 'event_id': 2}, { 'event_id': 2} ], [ { 'event_id': 3} ] ]

这是否有快速配方?

3 个答案:

答案 0 :(得分:2)

itertools.groupby非常适合:

map(lambda x: list(x[1]), (itertools.groupby(a, lambda x: x['event_id'])))
# => [[{'event_id': 1}, {'event_id': 1}, {'event_id': 1}], [{'event_id': 2}, {'event_id': 2}], [{'event_id': 3}]]
编辑:正如Justin Turner Arthur在评论中所说,这并不是很好(主要是因为我完全忘记了Python只将相邻元素组合在一起)。请使用他的解决方案。

答案 1 :(得分:2)

作为amadan suggestsitertools.groupby是解决此问题的绝佳方法。它需要一个可迭代和一个关键功能来分组。您首先要确保列表按相同的键排序,以便groupby不会为同一个键创建多个组(类似于在SQL中的GROUP BY之前执行ORDER BY的方式) )。

from itertools import groupby
from operator import itemgetter

grouping_key = itemgetter('event_id')  # produces a function like lambda x: x['event_id']

# If your events weren't already ordered with adjacent 'event_id's:
ordered_a = sorted(a, key=grouping_key)

grouped_a = [list(group) for _grouper, group in groupby(ordered_a, key=grouping_key)]

答案 2 :(得分:0)

首先,制作一个字典,将event_id值映射到dicts列表。

d = {}
for dict_ in a:
    if dict_['event_id'] in d:
        d[dict_['event_id']].append(dict_)
    else:
        d[dict['event_id']] = [dict_]

然后制作列表理解,将它们全部收集到一个列表中:

[val for key , val in d.items()]