蟒蛇:匹配类型的字典的名单列表

问题描述:

我有几个类型的字典,如:蟒蛇:匹配类型的字典的名单列表

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

因此,这些字符只有一个键'event_id''? “类似”的“event_id”值是什么意思? –

由于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)] 

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

编辑:贾斯汀·特纳亚瑟评论说,这是不是很大(主要是因为我完全忘了Python组只有相邻单元)。请使用他的解决方案。

+0

我喜欢这一个去哪里,不过你要确保列表在分组之前按分组键排序。 'event_key = itemgetter( '事项标识')' 'ordered_a =排序(A,键= event_key)' 你也可以把它多一点Python的用一个列表理解更换地图: '[列表(组)在石斑鱼,组在(itertools.groupby(ordered_a,event_key))]' –

+0

@JustinTurnerArthur:你是完全正确的。我更习惯Ruby,Python需要更多的跳跃。如果您将此作为您的解决方案提交,则可以获得我的投票。 – Amadan

+0

当然,完成了。 http://stackoverflow.com/a/39837004/1843865 –

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

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