Уведомления

Группа в Telegram: @pythonsu

#1 Март 8, 2011 09:19:40

Bujhm666
От:
Зарегистрирован: 2010-03-23
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Что то типа GROUP BY из SQL для списка словарей?

Есть примерно такая структура:

list = [{'key':1, 'a':100, 'b':50, 'c':80},
{'key':2, 'a':200, 'b':60, 'c':70},
{'key':2, 'a':300, 'b':70, 'c':60},
{'key':3, 'a':400, 'b':80, 'c':50},
{'key':4, 'a':500, 'b':90, 'c':40},
{'key':4, 'a':600, 'b':40, 'c':30}]
Из нее надо получить следующее:
list = [{'key':1, 'a':100, 'b':50, 'c':80},
{'key':2, 'a':500, 'b':130, 'c':130},
{'key':3, 'a':400, 'b':80, 'c':50},
{'key':4, 'a':1100, 'b':130, 'c':70}]
Т.е. просуммировать значения в словарях с одинаковым ‘key’.
Что то не пойму как это реализовать.



Офлайн

#2 Март 8, 2011 14:40:04

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Что то типа GROUP BY из SQL для списка словарей?

list = [
{'key':1, 'a':100, 'b':50, 'c':80},
{'key':2, 'a':200, 'b':60, 'c':70},
{'key':2, 'a':300, 'b':70, 'c':60},
{'key':3, 'a':400, 'b':80, 'c':50},
{'key':4, 'a':500, 'b':90, 'c':40},
{'key':4, 'a':600, 'b':40, 'c':30}]

conn = sqlite3.connect(":memory:")

conn.execute("create table list (key, a, b)")
conn.executemany("insert into list (key, a, b) values (:key, :a, :b)",list)
cur = conn.execute("select key, SUM(a), SUM(b) from list group by key")
print(cur.fetchall())



Офлайн

#3 Март 8, 2011 15:07:00

Bujhm666
От:
Зарегистрирован: 2010-03-23
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Что то типа GROUP BY из SQL для списка словарей?

Спасибо. Но меня интересовало. как это сделать на голом питоне, без использования SQL, и не привлекая сторонние БД.



Офлайн

#4 Март 8, 2011 15:15:55

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Что то типа GROUP BY из SQL для списка словарей?

Голый питон - это без использования стандартной библиотеки???



Офлайн

#5 Март 8, 2011 15:50:51

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Что то типа GROUP BY из SQL для списка словарей?

вот такой изврат получился

lis = [{'key':1, 'a':100, 'b':50, 'c':80},
{'key':2, 'a':200, 'b':60, 'c':70},
{'key':2, 'a':300, 'b':70, 'c':60},
{'key':3, 'a':400, 'b':80, 'c':50},
{'key':4, 'a':500, 'b':90, 'c':40},
{'key':4, 'a':600, 'b':40, 'c':30}]

from itertools import groupby

res = []
for k,l in groupby(lis, lambda x:x['key']):
l = list(l)
if len(l) > 1:
l = dict( [ reduce(lambda a,b: ( a[0],a[1]+b[1]) , x) for x in map(None, *[x.items() for x in l]) ] )
l.update({ 'key':k })
else: l = l[0]
res.append(l)

print res
если ключи не будут идти по порядку то их нужно будет сначала отсортировать

Отредактировано (Март 8, 2011 15:51:21)

Офлайн

#6 Март 8, 2011 16:01:50

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Что то типа GROUP BY из SQL для списка словарей?

В этом варианте несколько модифицирована структура данных

li = [{'key':1, 'a':100, 'b':50, 'c':80},
{'key':2, 'a':200, 'b':60, 'c':70},
{'key':2, 'a':300, 'b':70, 'c':60},
{'key':3, 'a':400, 'b':80, 'c':50},
{'key':4, 'a':500, 'b':90, 'c':40},
{'key':4, 'a':600, 'b':40, 'c':30}]

listOfDict=[[rec.pop('key'),rec] for rec in li]

def dictadd(a,b):
for k,v in b.iteritems():
vv=a.get(k,0)
a[k]=vv+v

res={}
for key,val in listOfDict:
vv=res.get(key,{})
dictadd(vv,val)
res[key]=vv



Офлайн

#7 Март 8, 2011 18:43:54

Bujhm666
От:
Зарегистрирован: 2010-03-23
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Что то типа GROUP BY из SQL для списка словарей?

Всем большое спасибо, буду экспериментировать в плане скорости обработки. Это я тут 5 строчек набросал, а у меня такой бодяги на 50 мегабайт будет.



Офлайн

#8 Март 8, 2011 19:59:35

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Что то типа GROUP BY из SQL для списка словарей?

Bujhm666
Всем большое спасибо, буду экспериментировать в плане скорости обработки. Это я тут 5 строчек набросал, а у меня такой бодяги на 50 мегабайт будет.
Тогда выбор в сторону SQLite очевиден.



Офлайн

#9 Март 8, 2011 20:09:35

Bujhm666
От:
Зарегистрирован: 2010-03-23
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Что то типа GROUP BY из SQL для списка словарей?

Да я не против SQLITE, просто хочу проверить несколько вариантов. Я эти данные тяну из dbf-файлов, что уже и так дает приличные тормоза и ладно, если бы просто перегнать структуру в sqllite (mysql, postgrees и т.д.) и с ней работать, но нужно использовать именно dbf, а т.к. данные постоянно меняются приходится это делать при каждом старте программы.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version