python:匹配dict的列表

python:匹配dict的列表,python,Python,我有一些格言,比如: a=[{'事件id':1},{'事件id':1},{'事件id':1},{'事件id':2},{'事件id':2},{'事件id':3}] 我想要一个列表列表,每个子列表包含具有类似事件id值的所有DICT: 有没有一个快速的方法可以做到这一点?itertools.groupby非常适合: map(lambda x: list(x[1]), (itertools.groupby(a, lambda x: x['event_id']))) # => [[{'event

我有一些格言,比如:

a=[{'事件id':1},{'事件id':1},{'事件id':1},{'事件id':2},{'事件id':2},{'事件id':3}]

我想要一个列表列表,每个子列表包含具有类似
事件id
值的所有DICT:


有没有一个快速的方法可以做到这一点?

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}]]

编辑:正如JustinTurnerArthur在评论中所说,这并不好(主要是因为我完全忘记了Python只对相邻元素进行分组)。请使用他的解决方案。

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}]]

编辑:正如JustinTurnerArthur在评论中所说,这并不好(主要是因为我完全忘记了Python只对相邻元素进行分组)。请使用他的解决方案。

首先,将
事件id
值映射到dict列表

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()]

首先,将dictionary映射
event\u id
值到dict列表

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()]
正如,
itertools.groupby
是解决这个问题的一个很好的方法。它需要一个iterable和一个键函数来分组。首先要确保列表按同一个键排序,这样groupby就不会为同一个键创建多个组(类似于在SQL中先创建ORDER by,再创建GROUP by)

正如,
itertools.groupby
是解决这个问题的一个很好的方法。它需要一个iterable和一个键函数来分组。首先要确保列表按同一个键排序,这样groupby就不会为同一个键创建多个组(类似于在SQL中先创建ORDER by,再创建GROUP by)


所以dicts只有一个键
“event\u id”
?“相似的”
event\u id
值意味着什么?所以dicts只有一个键
“event\u id”
?“相似的”
event\u id
值意味着什么?我喜欢这一个值的位置,不过您需要确保列表在分组之前按分组键排序
event\u key=itemgetter('event\u id')
ordered\u a=sorted(a,key=event\u key)
您还可以通过将映射替换为列表理解来让它更具python风格:
[list(group)for grouper,group in(itertools.groupby(ordered\u a,event\u key))]
@justinturnerather:您完全正确。我更习惯Ruby,Python需要更多的跳跃。如果你把它作为你的解决方案提交,我会投你一票。我喜欢这张表的走向,不过你需要确保列表在分组之前按分组键排序
event\u key=itemgetter('event\u id')
ordered\u a=sorted(a,key=event\u key)
您还可以通过将映射替换为列表理解来让它更具python风格:
[list(group)for grouper,group in(itertools.groupby(ordered\u a,event\u key))]
@justinturnerather:您完全正确。我更习惯Ruby,Python需要更多的跳跃。如果你把它作为你的解决方案,我投你一票。