蟒蛇:匹配类型的字典的名单列表
我有几个类型的字典,如:蟒蛇:匹配类型的字典的名单列表
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} ] ]
有没有这方面的快速配方?
由于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)]
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组只有相邻单元)。请使用他的解决方案。
我喜欢这一个去哪里,不过你要确保列表在分组之前按分组键排序。 'event_key = itemgetter( '事项标识')' 'ordered_a =排序(A,键= event_key)' 你也可以把它多一点Python的用一个列表理解更换地图: '[列表(组)在石斑鱼,组在(itertools.groupby(ordered_a,event_key))]' –
@JustinTurnerArthur:你是完全正确的。我更习惯Ruby,Python需要更多的跳跃。如果您将此作为您的解决方案提交,则可以获得我的投票。 – Amadan
当然,完成了。 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()]
因此,这些字符只有一个键'event_id''? “类似”的“event_id”值是什么意思? –