【发布时间】:2016-06-29 08:37:11
【问题描述】:
人们会认为这样做很容易。我发誓它是,只是......我似乎无法弄清楚。我如何转换:
terrible_way_to_describe_nested_json=['a.b.c','a.b.d','a.e','a.f','g.h']
进入
{
"a": {
"b": {
"c": None,
"d": None
},
"e": None,
"f": None
},
"g": {
"h": None
}
}
如果您认为 'a.b.c' 是解构 JSON 负载的 path,那么我有大约 200 个未排序的路径(无论顺序如何,转换都应该起作用),所有这些路径的深度最多为 8 个点热切地希望成为他们原始结构的一部分。我尝试过使用递归来解决这个问题,pandas 从内部节点中排序叶节点(荒谬?),疯狂的列表字典列表列表谁知道,甚至 autovivification。
毁灭和绝望的领域
这是我编写/放弃的 6 个部分实现之一。它甚至在边缘节点之前剥离嵌套键层,然后我就失去了理智。我几乎建议忽略它。
def dot_to_json(dotted_paths):
scope_map=[line.split('.') for line in dotted_paths] #Convert dots list to strings
# Sort and group list of strings according to length of list. longest group is last
b=[]
for index in range(max([len(x) for x in scope_map])+1):
a=[]
for item in scope_map:
if len(item)==index:
a.append(item)
b.append(a)
sorted_nest=[x for x in b if x] # finally group according to list length
#Point AA
# group string list 'prefix' with key:value
child_path=[]
for item in sorted_nest[-1]:
child_path.append([item[:-1],{item[-1]:None}])
# peel back a layer
new_child_path=[]
for scope in scope_map[-2]:
value=None # set value to None if fringe node
for index, path in enumerate(child_path):
if path[0]==scope: # else, save key + value as a value to the new prefix key
value=path[1]
child_path.pop(index) # 'move' this path off child_path list
new_child_path.append([scope[:-1],{scope[-1]:value}])
new_child_path+=child_path
#Point BB...
#Loop in some intelligent way between Point AA and Point BB
return new_child_path
#%%
dotted_json=['a.b.c','a.b.d','a.e','a.f','g.h']
scope_map=dot_to_json(dotted_json)
【问题讨论】:
标签: python json dictionary nested nested-loops