我有一个字典里面有一个较小的词典,而且我试图通过他们的"路径&#34来获取不是字典(但字符串,列表或整数)的值。 ;。我尝试使用DFS(深度优先搜索)技术,但没有成功。这是我的大词典的样本:
{
'visPlaneSection':
{
'ValueMode': 'Single Section',
'OriginInput': '[0.4, 1.3877787807814457E-17, -8.4350929019372245E-16] m,m,m',
'OrientationInput': '[1.0, 0.0, -3.3133218391157016E-16] m,m,m',
'CoordinateSystem': 'Laboratory->Reference',
'InputPartsInput': '[Region]',
'ValueIndex': '-1',
'visSingleValue':
{
'ValueQuantityInput': '0.0 m'
}
},
'ChildrenCount': '2'
}
我需要的数据是:visPlaneSection.ValueMode ='单节'
visPlaneSection.ValueMode ='单节'
visPlaneSection.OriginInput = [0.4,1.3877787807814457E-17,-8.4350929019372245E-16] m,m,m
[编辑]:更具体地说,这就是我今天所拥有的:
def test(dictio, path=[]):
print(path)
if type(dictio) == dict:
for k in dictio.keys():
if path == []:
path.append(k)
else:
new_path = path[-1] + "." + k
path.append(new_path)
test(dictio[k], path)
else:
path.pop()
所以,通过我向你展示的字典,每个列表的最后一个元素是我想要的路径,但它并没有完美地工作:
[]
['visPlaneSection']
['visPlaneSection', 'visPlaneSection.ValueMode']
['visPlaneSection', 'visPlaneSection.OriginInput']
['visPlaneSection', 'visPlaneSection.OrientationInput']
['visPlaneSection', 'visPlaneSection.CoordinateSystem']
['visPlaneSection', 'visPlaneSection.InputPartsInput']
['visPlaneSection', 'visPlaneSection.ValueIndex']
['visPlaneSection', 'visPlaneSection.visSingleValue']
['visPlaneSection', 'visPlaneSection.visSingleValue', 'visPlaneSection.visSingleValue.ValueQuantityInput']
['visPlaneSection', 'visPlaneSection.visSingleValue', 'visPlaneSection.visSingleValue.ChildrenCount']
对于最后一个元素,我们在这里visPlaneSection.visSingleValue.ChildrenCount
代替visPlaneSection.ChildrenCount
,这就是我的问题所在。
感谢您的耐心和答案
答案 0 :(得分:0)
你没有提到你用来做这个的python版本,python 3.4+看起来会更好用yield from
语法和诸如此类的东西。这是python 2.7的结果:
def deconstruct(node, path=None):
if not path:
path = []
for key, value in node.items():
if isinstance(value, dict):
for sub_value in deconstruct(value, path + [key]):
yield sub_value
else:
yield (value, '.'.join(path + [key]))
if __name__ == '__main__':
for value, path in deconstruct(input_dict):
print path, '=', value
如果您担心执行速度 - 您可能希望用路径变量中的字符串替换列表。
答案 1 :(得分:-1)
您需要对数据做什么?如果你只想打印它,你需要这样的东西:
def _print_dict(s,d):
for k,v in d.iteritems():
dot = "." if s else ""
p="{}{}{}".format(s,dot,k)
if isinstance(v,dict):
_print_dict(p,v)
else:
print "{} = {}".format(p,str(v))
然后:
_print_dict('',d)