如何在代表图形和 return 元素列表的字典上行走
How to walk on a dictionary which represent a graph and return a list of element
首先,对不起我的英语不是很好!
我有问题,找不到解决方案。
我有这样的图表:
我有这样的函数 return 图:
data = {
'Finition': {
'Metal': {
'colorCorrect1': {
'Color': {
'aiLayerShader2': {
'colorConstant1': {},
'colorConstant3': {},
'colorConstant2': {
'aiFloatToRgba1': {
'place2dTexture1': {}
}
},
'colorConstant4': {},
'colorConstant5': {
'aiFloatToRgba1': {
'place2dTexture1': {}
}
},
'colorConstant6': {}
}
}
}
}
}
}
我有一个主要组的列表(图片中的 Blues Nodes):
`
selection = ['Finition', 'Metal', 'Color', 'colorConstant2']
我需要一个可以 return 获取特定组的节点列表(在下一组之前)的函数:
return 值应该是这样的:
[
['Finition'],
['Metal', 'colorCorrect1'],
['Color', 'aiLayerShader2', 'colorConstant1', 'colorConstant3', 'colorConstant4', 'colorConstant5', 'colorConstant6', 'aiFloatToRgba1', 'place2dTexture1'],
['colorConstant2', 'aiFloatToRgba1', 'place2dTexture1']
]
我尝试了以下方法:
def search_recurssive(element=None, main={}, depth=0):
for key, value in main.items():
if key != element:
if isinstance(value, dict):
search_recurssive(element=element, main=value, depth=depth+1)
else:
pprint(value)
print depth
search_recurssive(element='Metal', main=data)
但是没有用。非常感谢您的帮助!
这是一个效率很低的方法:
def getChildren(data,s):
global selection
res = [s]
for child in data[s].keys():
if child in selection:
continue
else:
res.extend(getChildren(data[s], child))
return res
def getDataPart(data,s):
for key in data.keys():
if key == s:
return data
res = getDataPart(data[key],s)
if res is not None:
return res
results = []
for s in selection:
data_part = getDataPart(data,s)
results.append(getChildren(data_part,s))
def search_recurssive(element=None, main={}, depth=0):
l = []
for key, value in main.items():
if key != element:
if isinstance(value, dict):
l.append(key)
l += search_recurssive(element=element, main=value, depth=depth+1)
else:
pprint(value)
print depth
return l
我刚刚调整了您的代码,使其按照您对行的预期工作
search_recurssive(element='Metal', main=data)
现在您需要对此进行调整以获取下一个子图并搜索下一组。
编辑:
刚刚修改了我之前的答案以对选择进行全面搜索。
selection = ['Finition', 'Metal', 'Color', 'colorConstant2']
next_group = data
def search_recurssive(element=None, main={}, depth=0):
global next_group
l = []
for key, value in main.items():
if key != element:
if isinstance(value, dict):
l.append(key)
l += search_recurssive(element=element, main=value, depth=depth+1)
else:
print(value)
print depth
next_group = main
return l
def search_selection(selection, data):
return [search_recurssive(element, next_group) for element in selection]
首先,对不起我的英语不是很好! 我有问题,找不到解决方案。
我有这样的图表:
我有这样的函数 return 图:
data = {
'Finition': {
'Metal': {
'colorCorrect1': {
'Color': {
'aiLayerShader2': {
'colorConstant1': {},
'colorConstant3': {},
'colorConstant2': {
'aiFloatToRgba1': {
'place2dTexture1': {}
}
},
'colorConstant4': {},
'colorConstant5': {
'aiFloatToRgba1': {
'place2dTexture1': {}
}
},
'colorConstant6': {}
}
}
}
}
}
}
我有一个主要组的列表(图片中的 Blues Nodes): `
selection = ['Finition', 'Metal', 'Color', 'colorConstant2']
我需要一个可以 return 获取特定组的节点列表(在下一组之前)的函数:
return 值应该是这样的:
[
['Finition'],
['Metal', 'colorCorrect1'],
['Color', 'aiLayerShader2', 'colorConstant1', 'colorConstant3', 'colorConstant4', 'colorConstant5', 'colorConstant6', 'aiFloatToRgba1', 'place2dTexture1'],
['colorConstant2', 'aiFloatToRgba1', 'place2dTexture1']
]
我尝试了以下方法:
def search_recurssive(element=None, main={}, depth=0):
for key, value in main.items():
if key != element:
if isinstance(value, dict):
search_recurssive(element=element, main=value, depth=depth+1)
else:
pprint(value)
print depth
search_recurssive(element='Metal', main=data)
但是没有用。非常感谢您的帮助!
这是一个效率很低的方法:
def getChildren(data,s):
global selection
res = [s]
for child in data[s].keys():
if child in selection:
continue
else:
res.extend(getChildren(data[s], child))
return res
def getDataPart(data,s):
for key in data.keys():
if key == s:
return data
res = getDataPart(data[key],s)
if res is not None:
return res
results = []
for s in selection:
data_part = getDataPart(data,s)
results.append(getChildren(data_part,s))
def search_recurssive(element=None, main={}, depth=0):
l = []
for key, value in main.items():
if key != element:
if isinstance(value, dict):
l.append(key)
l += search_recurssive(element=element, main=value, depth=depth+1)
else:
pprint(value)
print depth
return l
我刚刚调整了您的代码,使其按照您对行的预期工作
search_recurssive(element='Metal', main=data)
现在您需要对此进行调整以获取下一个子图并搜索下一组。
编辑: 刚刚修改了我之前的答案以对选择进行全面搜索。
selection = ['Finition', 'Metal', 'Color', 'colorConstant2']
next_group = data
def search_recurssive(element=None, main={}, depth=0):
global next_group
l = []
for key, value in main.items():
if key != element:
if isinstance(value, dict):
l.append(key)
l += search_recurssive(element=element, main=value, depth=depth+1)
else:
print(value)
print depth
next_group = main
return l
def search_selection(selection, data):
return [search_recurssive(element, next_group) for element in selection]