我正在处理一个复杂的嵌套字典和列表数据结构。 我需要将数据展平,并将所有嵌套项带到级别0。 请参见下面的示例以获取更多明确信息:
{a:1,b:2,c:{c1:[{c11:1,c12:2,c13:3},{c21:1,c22:2,c23:3}],d1:[{d11:1,d12:2,d13:3},{d21:1,d22:2,d23:3}]},x:1,y:2}
我需要将这个扁平化为:
{a:1,b:2,c_c1_c11:1, c_c1_c12:2,c_c1_c13:3,c_c1_c21:1,c_c1_c22:2,c_c1_c23:3, c_d1,d11:1...and so on}
我参考了这篇文章中的第一个答案,但它只适用于嵌套字典,而不是列表嵌套在字典中,且更多的字典嵌套在这些列表中。
我稍微修改了代码以适应我的用例,但该代码无法正常工作。
def flattenDict(d):
node_map = {}
node_path = []
def nodeRecursiveMap(d, node_path):
for key, val in d.items():
if ((type(val) is not dict)&(type(val) is not list)):
node_map['_'.join(node_path + [key])] = val
if type(val) is list:
def nodeListRecursion(val,node_path):
for element in val:
if ((type(element) is not dict)&(type(element) is not list)) : node_map['_'.join(node_path + [key])] = element
if type(element) is list: nodeListRecursion(element,node_map)
if type(element) is dict: nodeRecursiveMap(element, node_path + [key])
nodeListRecursion(val,node_path)
if type(val) is dict: nodeRecursiveMap(val, node_path + [key])
nodeRecursiveMap(d, node_path)
return node_map
当我在这里粘贴代码时,缩进混乱了。但我真的很感谢任何帮助。
val = [val]
来处理字典值和列表值的方式非常聪明。 - blhsingdotmap.DotMap
/OrderedDict
/dict
以用于自定义/非内置类型 - 而不是遍历它,我首先将其转换为一个扁平化对象,然后(现在很容易)循环遍历值 - 谢谢。 - jtlz2