阅读复杂的词典Python

时间:2016-07-04 13:35:08

标签: python dictionary

我有一个字典里面有一个较小的词典,而且我试图通过他们的"路径&#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

  • ...等...
  • visPlaneSection.visSingleValue.ValueQuantityInput =' 0.0 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,这就是我的问题所在。
感谢您的耐心和答案

2 个答案:

答案 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)