2013-03-27 2 views
0

У меня есть следующий код:Как сделать словарь в словаре в MySQLPython?

import MySQLdb 
import sys 
import pprint 

connect = MySQLdb.connect(host = "127.8.2.3", port=3377, user = "root", db="data1") 
with connect: 

    cur = connect.cursor() 
    cur.execute("SELECT familynames,names FROM data1.files") 

    rows = cur.fetchall() 
pprint.pprint(rows) 

Я хочу создать большой словарь, который имеет «фамилии» как ключ и «имена», как value.Further, значение большого Dict (имена), должен снова быть диктом с ключом = имена и значением = количество идентичных имен под тем же именем.

Я пробовал функцию DictCursor MySQLPython, но он не способен создавать dict внутри dict.

Я также попытался сделать цикл над каждым элементом большого dict, чтобы разбить и создать еще один меньший dict (для значений большого dict), но поскольку возвращаемый результат cur.execute является кортежем, который не является возможно.

Может кто-нибудь помочь мне в этом отношении?

ответ

1

Вам нужно сделать некоторую обработку, чтобы получить эту структуру. Я бы использовал itertools.groupby, чтобы получить ваши строки, сгруппированные по фамилии, а затем collections.Counter(), чтобы создать нужное внутреннее сопоставление.

groupby требует, чтобы вы сортировали данные, поэтому запрос необходим пункт ORDER BY тоже:

from collections import Counter 
from itertools import groupby 
from operator import itemgetter 
import pprint 

import MySQLdb 

familynames = {} 

connection = MySQLdb.connect(host="127.8.2.3", port=3377, user="root", db="data1") 
with connection: 
    cur = connect.cursor() 
    cur.execute("SELECT familynames, names FROM data1.files ORDER BY familynames") 

    for familyname, names in groupby(cur, key=itemgetter(0)): 
     familynames[familyname] = Counter(row[1] for row in names) 

pprint.pprint(familynames) 

В groupby функциональные группы строк на первый элемент каждой строки (familynames столбец), так что цикл над то итерабельность names приведет только к строкам, где familynames имеет такое же значение.

Затем мы подставляем имена (второй столбец в каждой строке) в Counter(), что приводит к name ключам со счетом для каждого имени в качестве значения.

+0

Благодарим за помощь. Проблема с приведенным выше кодом заключается в том, что счетчик только считает свой ключ, поэтому в основном число счетчиков всегда 1. Что я хочу видеть, сколько раз я получаю одинаковые имена с одна фамилия (смотри ниже): например: – UserYmY

+0

{Nickelson: {Сэм: 2 Джек: 5 Джо: 10 Wiliam: 1} Gabrielii: {Мария: 2 \t Сами: 3}} – UserYmY

+0

@ user2058811: 'names' - это не имя? Если второй столбец содержит 'sam',' Jack', 'Joe' и т. Д., То счетчик будет считать те, что вам нравится. –

Смежные вопросы