从字典中获取嵌套数组

2024-09-28 20:59:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解析模拟的结果,以提取所有numpy数组的结果。在简单材质上进行模拟时,我们可能会得到一个包含数组值的字典:

{'material1':array, 'material2':array, ...}

在更复杂的材质模拟中,我们最终使用嵌套词典,例如:

^{pr2}$

嵌套的深度是任意的,我要做的是创建一个绘图,其中所有可用的数组都返回给用户,并由它们的嵌套命名。例如,上述结构的结果是:

{'material1.shellmaterial' : array, 'material1.corematerial' : array}

然后我们把这些放在下拉菜单中。便于在绘图中查看。有没有人有一个好方法可以迭代任意嵌套的字典,并使用上面所示的新键只返回数组类型值?在

为了json兼容性,结果必须以这种方式存储,所以我不能真正地返回并重构以避免这种情况。在


Tags: 用户numpy绘图字典数组结构array命名
2条回答

为了完整起见,下面是一个接受的答案,其中包含一个类型参数,它允许您筛选出要保留的值类型。在我的例子中,这只是数组值,但是这种行为对于解析json文件的结果或者特别是我们的模拟程序的数据非常有用。在

def flattenDict(d, *types):
    node_map = {}
    node_path = [] 
    def nodeRecursiveMap(d, node_path): 
        for key, val in d.items():
            if type(val) in types: 
                node_map['.'.join(node_path + [key])] = val 
            if type(val) is dict: 
                nodeRecursiveMap(val, node_path + [key])
    nodeRecursiveMap(d, node_path)
    return node_map

例如,只保留整数和字符串:

^{pr2}$

这是一个函数,我和一些决策树一起用于语言处理,它不是你想要的,但它的基本思想是相同的。在

def nodeMapForDict(d):
    node_map = []
    node_path = [] 
    def nodeRecursiveMap(d, node_path): 
        for key, val in d.items():
            if type(val) is not dict: node_map.append(node_path + [key]) 
            if type(val) is dict: 
                nodeRecursiveMap(val, node_path + [key])
    nodeRecursiveMap(d, node_path)
    return node_map

这里有一个适合您的用例:

^{pr2}$

示例:

d= {'d': [1, 2, 3, 4], 'e': {'b': {'c': 1}}, 'a': {'b': 'c'}}
In [49]: flattenDict(d)
Out[49]: {'d': [1, 2, 3, 4], 'e.b.c': 1, 'a.b': 'c'}

相关问题 更多 >