8

次の形式のテーブルがあります。

A1, B1, C1, (value)
A1, B1, C1, (value)
A1, B1, C2, (value)
A1, B2, C1, (value)
A1, B2, C1, (value)
A1, B2, C2, (value)
A1, B2, C2, (value)
A2, B1, C1, (value)
A2, B1, C1, (value)
A2, B1, C2, (value)
A2, B1, C2, (value)
A2, B2, C1, (value)
A2, B2, C1, (value)
A2, B2, C2, (value)
A2, B2, C2, (value)

私はPythonでそれを辞書として、次の形式で扱いたいと思います:

H = {
    'A1':{
        'B1':{
            'C1':[],'C2':[],'C3':[] },
        'B2':{
            'C1':[],'C2':[],'C3':[] },
        'B3':{
            'C1':[],'C2':[],'C3':[] }
    },
    'A2':{
        'B1':{
            'C1':[],'C2':[],'C3':[] },
        'B2':{
            'C1':[],'C2':[],'C3':[] },
        'B3':{
            'C1':[],'C2':[],'C3':[] }
    }
}

したがってH[A][B][C]、特定の一意の値のリストが生成されます。小さな辞書の場合、上記のように事前に構造を定義するだけかもしれませんが、事前に辞書キーを指定せずに、テーブルを反復処理して辞書を作成する効率的な方法を探しています。

4

5 に答える 5

12
input = [('A1', 'B1', 'C1', 'Value'), (...)]

from collections import defaultdict

tree = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
#Alternatively you could use partial() rather than lambda:
#tree = defaultdict(partial(defaultdict, partial(defaultdict, list)))

for x, y, z, value in input:
    tree[x][y][z].append(value)
于 2012-04-17T14:35:25.293 に答える
4

H [A] [B] [C]にのみアクセスする場合(つまり、H[A]またはH[A] [B]のみにアクセスすることはありません)、IMOクリーナーソリューションをお勧めします。デフォルトとしてタプルを使用します。インデックス:

from collections import defaultdict
h = defaultdict(list)
for a, b, c, value in input:
    h[a, b, c].append(value)
于 2012-04-17T14:48:22.197 に答える
2
d = {}
for (a, b, c, value) in your_table_of_tuples:
   d.setdefault(a, {}).setdefault(b,{}).setdefault(c,[]).append(value)
于 2012-04-17T14:37:28.250 に答える