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

次に、名前 (各行の 2 番目の列) を にフィードしますCounter()。これにより、name各名前のカウントを値として持つキーが生成されます。

于 2013-03-27T12:02:45.617 に答える