2016-10-03 2 views
1

내가 좋아하는 몇 dicts 있습니다파이썬 : 일치 dicts의 목록 목록

a = [ { 'event_id': 1}, { 'event_id': 1}, { 'event_id': 1}, { 'event_id': 2}, { 'event_id': 2}, { 'event_id': 3} ]

나는리스트의 목록이 원하는을, 비슷한 event_id 값으로 모든 dicts을 포함하는 각 하위 목록 :

[ [ { 'event_id': 1}, { 'event_id': 1}, { 'event_id': 1} ], [ { 'event_id': 2}, { 'event_id': 2} ], [ { 'event_id': 3} ] ]

빠른 제조법이 있습니까?

+0

그래서 하나의 키는 'event_id'입니까? 그리고 "비슷한"event_id 값은 무엇을 의미합니까? –

답변

2

amadan suggests으로 itertools.groupby는이 문제에 대한 가장 좋은 방법이 될 수 있습니다. 그룹화 할 때 iterable 및 key 함수가 필요합니다. 먼저 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

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

편집이 : 저스틴 터너 아서 댓글에서 말했듯이,이 크지 않다 (I 완전히 잊어 주로 때문 파이썬 그룹에만 인접한 요소). 그의 해결책을 사용하십시오.

+0

나는 그룹을 분류하기 전에 목록이 그룹화 키에 의해 정렬되도록하고 싶지만이 것이 어디로가는 지 알고 싶다. ( '[목록 : 'event_key = itemgetter ('EVENT_ID')' 'ordered_a = 분류 (A, 키 = event_key)' 는 또한 지능형리스트와지도를 대체하여 좀 더 파이썬 할 수 있습니다 그룹) 그룹에 (itertools.groupby (ordered_a, event_key))] ' –

+0

@JustinTurnerArthur : 당신은 완전합니다. 나는 Ruby에 익숙하다. 그리고 Python은 더 많은 후프 - 점프가 필요하다. 그것을 당신의 해결책으로 제출하면 내 표가됩니다. – Amadan

+0

예, 끝났습니다. http://stackoverflow.com/a/39837004/1843865 –

0

사전에 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()]