/!\ 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'}]
この出力を取得しています:{'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'} –
出力を 'pprint'で出力するように変更しました。結果は正しいですか? – glegoux
あなたの出力値では "wow"が正しいIDとparent_id(6,5)を持っていますが、私はid = 8とparent_id = 7として「うわー」を持っています –