我试图解析模拟结果,以提取所有numpy数组的结果。在模拟简单材质时,我们可能会得到一个包含数组值的字典:
{'material1':array, 'material2':array, ...}
在更复杂的材料模拟中,我们最终会使用嵌套字典,如:
{'material1': {'shellmaterial':array, 'corematerial':array}}
嵌套的深度是任意的,我想要做的是创建一个图,其中所有可用的数组都返回给用户,由它们的嵌套命名。例如,上述结构最终会像:
{'material1.shellmaterial' : array, 'material1.corematerial' : array}
然后我们将这些放在下拉菜单中。便于在情节中查看。有没有人有一个很好的方法来迭代一个任意嵌套的字典并使用新的键返回只有数组类型值,如上所示?
结果必须以这种方式存储以获得json兼容性,因此我无法回过头来重构以避免这种情况。
答案 0 :(得分:1)
这是我用于语言处理的一些决策树的函数,它不是你想要的,但它是相同的基本思想。
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
这是一个适合您的用例:
def flattenDict(d):
node_map = {}
node_path = []
def nodeRecursiveMap(d, node_path):
for key, val in d.items():
if type(val) is not dict: node_map['.'.join(node_path + [key])] = val
if type(val) is dict:
nodeRecursiveMap(val, node_path + [key])
nodeRecursiveMap(d, node_path)
return node_map
示例:
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'}
答案 1 :(得分:0)
为了完整性,这里是一个类型参数的接受答案,它允许您过滤掉要保留的值的类型。在我的例子中,这只是数组值,但这种行为对于解析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
例如,仅保留整数和字符串:
d= {'d': [1, 2, 3, 4], 'e': {'b': {'c': 1}}, 'a': {'b': 'c'}}
In [1]: flattenDict(d, int, basestring)
Out[2]: {'e.b.c': 1, 'a.b': 'c'}