我有几个像:
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} ] ]
这是否有快速配方?
答案 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 suggests,itertools.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()]