2017-06-24 15 views
2

私は、このような辞書を持っ例えば、配列またはDB内のスキームのようなツリーにそれを埋めるために必要があります持っている私は木にそれを埋めるための辞書の必要性を持って、どのように?

a = {"seasons": "episodes", "peka": {"lol": "wow", "kek": {"wtf": "is this"}}, "ololo": "wololo"} 

キー"seasons"自身ID = 1Parent_ID = NONE と値"episode"は独自のを持ってID = 2Parent_ID = 1、 と辞書の他の項目と同じです。

a = {"seasons": "episodes", "peka": {"lol": "wow", "kek": {"wtf": "is this"}}, "ololo": "wololo"} 

_id = {} 

def newid(): 
    id = _id.setdefault('foo', 0) 
    _id['foo'] += 1 
    return id 

def flat(dic, parent): 
    for k,v in dic.items(): 
     id = newid() 
     yield (id, parent, k, v if not isinstance(v, dict) else None) 
     if isinstance(v, dict): 
      for tup in flat(v, id): 
       yield tup 

print list(flat(a, newid())) 

出力します:

答えて

0

/!\ dictionnaryにおける順序は保証されません警告(キー、値)のdictionnary順序が保証されていないオブジェクトAは、すなわちされhere

a = { 
     "seasons": "episodes", 
     "peka": {"lol": "wow", "kek": {"wtf": "is this"}}, 
     "ololo": "wololo" 
    } 

を見ますあなたがprint(a)の場合はランダムですが、あなたは:

{'ololo': 'wololo', 'peka': {'kek': {'wtf': 'is this'}, 'lol': 'wow'}, 'seasons': 'episodes'} 

これは別の注文です。

同じ注文を維持するには、このタイプをファイルfile.jsonとユーザ OrderedDictにコピーしてください。

file.json:ここ

{ 
    "seasons": "episodes", 
    "peka": {"lol": "wow", "kek": {"wtf": "is this"}}, 
    "ololo": "wololo" 
} 

ソリューション:

import json 
from collections import OrderedDict 
from pprint import pprint 

with open('file.json', 'r') as filename: 
    a = json.load(filename, object_pairs_hook=OrderedDict) 


def build_item(_id, parent_id, value): 
    return {'ID': _id, 'Parent_ID': parent_id, 'Value': value} 


def dfs(_id, root, tree): 
    _id += 1 
    flat_tree = [build_item(_id, None, root)] 
    stack = [(_id, tree)] 
    while len(stack) != 0: 
     parent_id, tree = stack.pop(0) 
     if isinstance(tree, dict): 
      for value in tree.keys(): 
       _id += 1 
       flat_tree.append(build_item(_id, parent_id, value)) 
       stack.append((_id, tree[value])) 
     else: 
      value = tree 
      _id += 1 
      flat_tree.append(build_item(_id, parent_id, value)) 
    return _id, flat_tree 


def convert_dict_to_flat_tree(d): 
    flat_trees = list() 
    _id = 0 
    for root, tree in d.items(): 
     _id, flat_tree = dfs(_id, root, tree) 
     flat_trees.extend(flat_tree) 
    return flat_trees 


flat_tree = convert_dict_to_flat_tree(a) 

pprint(flat_tree) 

出力:

[{'ID': 1, 'Parent_ID': None, 'Value': 'seasons'}, 
{'ID': 2, 'Parent_ID': 1, 'Value': 'episodes'}, 
{'ID': 3, 'Parent_ID': None, 'Value': 'peka'}, 
{'ID': 4, 'Parent_ID': 3, 'Value': 'lol'}, 
{'ID': 5, 'Parent_ID': 3, 'Value': 'kek'}, 
{'ID': 6, 'Parent_ID': 4, 'Value': 'wow'}, 
{'ID': 7, 'Parent_ID': 5, 'Value': 'wtf'}, 
{'ID': 8, 'Parent_ID': 7, 'Value': 'is this'}, 
{'ID': 9, 'Parent_ID': None, 'Value': 'ololo'}, 
{'ID': 10, 'Parent_ID': 9, 'Value': 'wololo'}] 
+0

この出力を取得しています:{'ID':1、 'Parent_ID':None、 'Value' : 'seasons'} {'ID':2、 'Parent_ID':1、 '値': 'エピソード'} {'ID':3、 'Parent_ID':なし、 '値': 'peka'} {'ID':5、 'Parent_ID':3、 'Value': 'kek'} {'ID':6} {ID:4、 'Parent_ID':3、 'Value' 、 'Parent_ID':5、 'Value': 'wtf'} {'ID':7、 'Parent_ID':6、 '値': 'これです'} {'ID':8、 'Parent_ID' '、' Value ':' olow '} {' ID ':10、' Parent_ID ':9、' Value ':'値 ':'ワウ '} {' ID ':9、' Parent_ID ' 'wololo'} –

+0

出力を 'pprint'で出力するように変更しました。結果は正しいですか? – glegoux

+0

あなたの出力値では "wow"が正しいIDとparent_id(6,5)を持っていますが、私はid = 8とparent_id = 7として「うわー」を持っています –

0

あなたはこのような何かをしたい(?ID、親ID、キー、値)

[(1, 0, 'seasons', 'episodes'), 
(2, 0, 'ololo', 'wololo'), 
(3, 0, 'peka', None), 
(4, 3, 'kek', None), 
(5, 4, 'wtf', 'is this'), 
(6, 3, 'lol', 'wow')] 

これらの形式でタプルです。私はE(ID、Parent ID、Key)V(ID、Value)を出力する方がいいでしょう。

+0

私はすべての項目(kは、v)をプリントアウトする必要があり、 IDとParent_IDを持つ –

関連する問題