2016-05-24 1 views
1

にネストされた辞書構造を平らにし、私はこのデータセットにこのいくつかの後処理のためのデータセット

{'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_keysvisitに直接渡す代わりにインデックスを使用する代替方法について考えました。しかし、これは本当に私は醜い初期コピーを取り除くためには役立ちません:

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)?

答えて

1

:可変辞書の深さを考慮して変更されました。

私の前回の回答(下記)のmerge機能を使用すると、発信者を変更するupdateを呼び出すことを避けることができます。最初に辞書をコピーする必要はありません。あなたがkeys入力を保護する必要がある理由私は理解していない

def flatten(data, keys): 
    out = [] 
    values = {} 
    def visit(node, id): 
     if id: 
      id -= 1 
      for key, child in node.items(): 
       values[keys[id]] = key 
       visit(child, id) 
     else: 
      out.append(merge(node, values)) # use merge instead of update 
    visit(data, len(keys)) 
    return out  

一つのことです。私はそれらがどこでも修正されているとは思わない。リスト内包について


前答え

どのように?

def merge(d1, d2): 
    return dict(list(d1.items()) + list(d2.items())) 

[[merge({'foobar': key, 'animal': sub_key}, sub_sub_dict) 
    for sub_key, sub_sub_dict in sub_dict.items()] 
     for key, sub_dict in a.items()] 

トリッキーな部分は、(Noneを返す)updateを使用せずに辞書をマージしました。

+0

あなたのソリューションは私のサンプルでは動作しますが、より多くのレイヤを持つ実際のデータでは機能しません。私はここで再帰アルゴリズムが必要です。 – nowox

関連する問題