にネストされた辞書構造を平らにし、私はこのデータセットにこのいくつかの後処理のためのデータセット
{'foo': {
'cat': {'name': 'Hodor', 'age': 7},
'dog': {'name': 'Mordor', 'age': 5}},
'bar': { 'rat': {'name': 'Izidor', 'age': 3}}
}
のような構造をフラット化する必要があります。
[{'foobar': 'foo', 'animal': 'dog', 'name': 'Mordor', 'age': 5},
{'foobar': 'foo', 'animal': 'cat', 'name': 'Hodor', 'age': 7},
{'foobar': 'bar', 'animal': 'rat', 'name': 'Izidor', 'age': 3}]
だから私は、この関数を書いた:
入力を保護するためにcopy.copy
を使用する必要があるため、私は本当に満足しませんでした。明らかに、flatten
を使用する場合、入力を変更したくない場合があります。
次に、よりグローバルな変数(少なくともグローバルにflatten
)を使用し、primary_keys
をvisit
に直接渡す代わりにインデックスを使用する代替方法について考えました。しかし、これは本当に私は醜い初期コピーを取り除くためには役立ちません:
def flatten(data, keys):
data = copy.copy(data)
keys = copy.copy(keys)
keys.reverse()
out = []
values = {}
def visit(node, id):
if id:
id -= 1
for key, child in node.iteritems():
values[keys[id]] = key
visit(child, id)
else:
node.update(values)
out.append(node)
visit(data, len(keys))
return out
の使用を避けることができる、より良い実装(あり:だからここ
keys = copy.copy(primary_keys)
keys.reverse()
は私の最終版がありますcopy.copy
)?
あなたのソリューションは私のサンプルでは動作しますが、より多くのレイヤを持つ実際のデータでは機能しません。私はここで再帰アルゴリズムが必要です。 – nowox