4

次のプロパティを持つ辞書構造が必要です。

  1. 二重にネストされています (つまり、非常に多くの言葉で 3 次元)
  2. レベルごとに追加されたものの順序を記憶します

したがって、次のようにアイテムを追加すると:

# d = something dict-ish
d['a']['b']['c'] = 'd'
d['a'][1][2] = 3
d['f']['g']['e'] = 'g'
d['f'][5][6] = 7
d['a']['foo']['bar'] = 'hello world'

次の理解の結果:

[(i, j, k, d[i][j][k]) for i in d for j in d[i] for k in d[i][j]]

次のようになります。

[('a', 'b', 'c', 'd'), ('a', 1, 2, 3), ('a', 'foo', 'bar', 'hello world'), ('f', 'g', 'e', 'g'), ('f', 5, 6, 7)]

新しいキーにこの構造を強制するためにa を使用しようとしたdefaultdictので、次のように長い方法で入力する必要はありません。

# long way
d = OrderedDict()
d['a'] = OrderedDict([('b', OrderedDict([('c', 'd')]))])
d['a'][1] = OrderedDict([(2,3)])

# tried to use defaultdict
d = defaultdict(lambda: defaultdict(lambda: OrderedDict()))
d['a']['b']['c'] = 'd'
d['a'][1][2] = 3

しかし、defaultdictは上位 2 つのレベルの順序を覚えていません。動作をマージする方法がわからないので、上位 2 つのレベルは明らかにdefaultdict動作を譲っていdます。希望する構造を実現するにはどうすればよいですか?

4

2 に答える 2

1

昔ながらの方法:

data = [('a','b','c','d'), ('a',1,2,3), ('f,'g','e','g'), ('f',5,6,7), (a','foo','bar','hello world')]

answer = OrderedDict()
for d in data:
    if d[0] not in answer:
        answer[d[0]] = OrderedDict()
    if d[1] not in answer[d[0]]:
        answer[d[0]][d1] = OrderedDict()
    if d[2] not in answer[d[0]][d1]:
        answer[d[0]][d1][d2] = OrderedDict()
    answer[d[0]][d1][d2] = d[3]
于 2013-07-22T19:57:03.280 に答える