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需要更多的跳跃。如果你把它作为你的解决方案,我投你一票。