0

我有以下代码:

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)

我想创建一个大字典,其中“姓氏”作为键,“名称”作为值。此外,大字典(名称)的值应该再次是字典本身,键 = 名称,值 = 数量同姓下同名。

我已经尝试过 MySQLPython 的 DictCursor 函数,但它不能在 dict 中创建 dict。

我还尝试对大字典的每个项目进行循环以拆分并创建另一个较小的字典(用于大字典的值),但是由于 cur.execute 的返回结果是一个也不可能的元组。

有人可以在这方面帮助我吗?

4

1 回答 1

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以每个名称的计数作为值的键。

于 2013-03-27T12:02:45.617 回答