Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2014 09:56:40

foger
Зарегистрирован: 2014-09-23
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как сгруппировать данные

Добрый день. Мне нужно забрать данные из базы и потом их обработать. Первый вопрос: правильно ли я делаю выборку из MySQL? Или это рабочий, но “быдлокодерский” способ?

import MySQLdb, sys
...
result = []
try:
    cur.execute("SELECT time, zone, num, class FROM calls001 WHERE oper = %s" % (oper))
    calls = cur.fetchall()
    for call in calls:
        cur.execute("SELECT zone_name FROM zones WHERE zone_id = %s" % (calls[1]))
        zones = cur.fetchall()
        for zone in zones:
            result.append({'time': calls[0], 'zone_id': calls[1], 'num': calls[2], 'class': calls[3], 'name': zones[0]})
except MySQLdb.Error, e:
    print "Ошибка %d: %s" % (e.args[0], e.args[1])
    print "Ничего не найдено"

В питоне новичек.

Второй вопрос (самое главное для меня и непонятное!):

Вот создаю я список словарей из данных. Теперь мне нужно из него создать новый словарь сгруппированый по определенному ключу. Т.е. должен получиться словарь, в котором данные будут сгруппированы по <zone_id>, примерно так (не знаю как это будет выглядеть в питоне):
4342: {'time': 23, 'num': 4951234565, 'class': 3, 'name': 'Moscow'}, {'time': 11, 'num': 4959829011, 'class': 2, 'name': 'Moscow'}, {'time': 120, 'num': 4997892677, 'class': 1, 'name': 'Moscow'}
… и т.д. для этой zone_id
затем идет для следующей zone_id:
67999: {'time': 5, 'num': 8469901234, 'class': 1, 'name': 'Samara'}, {'time': 19, 'num': 8469909283, 'class': 1, 'name': 'Samara'}, {'time': 349, 'num': 8469908922, 'class': 3, 'name': 'Samara'}, {'time': 4, 'num': 8469909911, 'class': 3, 'name': 'Samara'}, {'time': 15, 'num': 8469901412, 'class': 3, 'name': 'Samara'}
и т.д.

Как получить такой словарь?

если группировать так:

for i in result:
    grouped[i['zone_id']] = {'time': i['time'], 'num': i['num'], 'class': i['class'], 'name': i['name']}

то получается, что да, группируется по zone_id, но в словарь попадает лишь одна запись, относящаяся к этой zone_id, а не все, который к ней относятся.

Суть задачи состоит в том, чтобы мне потом посчитать количество минут для определенных телефонных направлений и положить данные в файл (zone_id => кол-во_минут). В PHP я это мог сделать с легкостью, но решил пересаживаться на Python и как-то пока что не идет. Понимаю, что PHP меня избаловал своей простотой

Помогите пожалуйста разобраться.

Отредактировано foger (Дек. 5, 2014 10:10:07)

Офлайн

#2 Дек. 5, 2014 16:49:04

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Как сгруппировать данные

foger
Первый вопрос: правильно ли я делаю выборку из MySQL?
Вместо того чтобы делать много запросов к zones, сделайте в первом join.

foger
Теперь мне нужно из него создать новый словарь сгруппированый по определенному ключу
В itertools есть groupby, который может группировать данные по определенному признаку. Обратите внимание что список должен быть отсортирован по этому признаку.

from itertools import groupby
from pprint import pprint
 
my_data = [
	{'name': 'Moscow', 'value': 1},
	{'name': 'Kiev', 'value': 3},
	{'name': 'Moscow', 'value': 2},
	{'name': 'Minsk', 'value': 4},
	{'name': 'Kiev', 'value': 5},
	{'name': 'Moscow', 'value': 6},
]
sorted_data = sorted(my_data, key=lambda x: x['name'])
 
my_grouped_data = {}
# my_grouped_data = dict((name, list(items)) for (name, items) in groupby(sorted_data, lambda x: x['name']))
for name, items in groupby(sorted_data, lambda x: x['name']):
	my_grouped_data[name] = list(items)
 
pprint(my_grouped_data)
{'Kiev': [{'name': 'Kiev', 'value': 3}, {'name': 'Kiev', 'value': 5}],
'Minsk': [{'name': 'Minsk', 'value': 4}],
'Moscow': [{'name': 'Moscow', 'value': 1},
{'name': 'Moscow', 'value': 2},
{'name': 'Moscow', 'value': 6}]}

Отредактировано GreyZmeem (Дек. 5, 2014 16:52:22)

Офлайн

#3 Дек. 5, 2014 20:06:40

foger
Зарегистрирован: 2014-09-23
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как сгруппировать данные

GreyZmeem
Спасибо большое за помощь! Все так как мне и нужно было!

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version