Уведомления

Группа в Telegram: @pythonsu

#1 Март 29, 2012 14:15:03

martin
От:
Зарегистрирован: 2010-10-29
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Группировка списка словарей по значению

Есть начальный список:

[
  {'group_id' : 1, 'name' : 'aaa', 'age' : 111},
  {'group_id' : 1, 'name' : 'bbb', 'age' : 222},
  {'group_id' : 2, 'name' : 'ccc', 'age' : 333},
  {'group_id' : 2, 'name' : 'ddd', 'age' : 444},
  {'group_id' : 3, 'name' : 'eee', 'age' : 555},
  {'group_id' : 3, 'name' : 'fff', 'age' : 666},
]
Как его сгруппировать по group_id чтобы получилось примерно следующее:

[
  {'group_id': 1, 'data' : [{'name' : 'aaa', 'age' : 111}, {'name' : 'bbb', 'age' : 222}]}, 
  {'group_id': 2, 'data' : [{'name' : 'ccc', 'age' : 333}, {'name' : 'ddd', 'age' : 444}]}, 
  {'group_id': 3, 'data' : [{'name' : 'eee', 'age' : 555}, {'name' : 'fff', 'age' : 666}]}, 
]



Офлайн

#2 Март 29, 2012 22:28:11

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Группировка списка словарей по значению

#-*- coding: utf8 -*-
import itertools
import operator
INPUT=[
  {'group_id' : 1, 'name' : 'aaa', 'age' : 111},
  {'group_id' : 1, 'name' : 'bbb', 'age' : 222},
  {'group_id' : 2, 'name' : 'ccc', 'age' : 333},
  {'group_id' : 2, 'name' : 'ddd', 'age' : 444},
  {'group_id' : 3, 'name' : 'eee', 'age' : 555},
  {'group_id' : 3, 'name' : 'fff', 'age' : 666},
]
def groupid_drop(d):
    del d['group_id']
    return d
RESULT=[{'group_id': i, 'data': map(groupid_drop, grp)} for i, grp in itertools.groupby(INPUT, operator.itemgetter('group_id'))]
print RESULT

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version