如何获取json文件中的父键路径?

时间:2018-02-14 16:58:07

标签: python json python-2.7 data-structures

在python中我们可以得到一个键的父键路径,我的json看起来像是跟着.. 例如,如果我输入a1:它应该给出:PROJ1 / LOB1。 list []内的所有键都是唯一的

{
    'PROJ1': {
        u'LOB1': [u'a1', u'a2'],
        u'LOb2': [u'v1', u'v2'],
        u'LOBA': [u'o1', u'oa', u'o2', u'o3'],
        u'LOBX': [u'n1', u'n2'],
        u'LOB': [u'b1', u'b2']
    },
  'PROJ12': {
        u'LOBa': [u'aa1', u'aa2'],
        u'LOBX': [u'vx1', u'vx2']
    },
}

我在另一个帖子上发现了这个,但它不适用于上述数据。失败:unhashable type: 'list'

def keypaths(myDict):
    for key, value in myDict.items():
        if isinstance(value, collections.Mapping):
            for subkey, subvalue in self.keypaths(value):
                yield [key] + subkey, subvalue
        else:
            yield [key], value

reverse_dict = {value: keypath for keypath, value in keypaths(example_dict)}

1 个答案:

答案 0 :(得分:0)

您需要深入查看返回的list个值,以获取a1a2 ......等等。您可以对{{1用于翻转返回的键/值的函数::

keypaths

这假设您的所有值都是唯一的,否则路径会被覆盖。

或者,您可以在不修改import collections sample = { 'PROJ1': { u'LOB1': [u'a1', u'a2'], u'LOb2': [u'v1', u'v2'], u'LOBA': [u'o1', u'oa', u'o2', u'o3'], u'LOBX': [u'n1', u'n2'], u'LOB': [u'b1', u'b2'] }, 'PROJ12': { u'LOBa': [u'aa1', u'aa2'], u'LOBX': [u'vx1', u'vx2'] }, } def keypaths(myDict): for key, value in myDict.items(): if isinstance(value, collections.Mapping): for subvalue, subkey in keypaths(value): yield subvalue, [key] + subkey elif isinstance(value,list): for i in value: yield i, [key] else: yield value, [key] my_dict = {k:i for k, i in keypaths(sample)} 函数的情况下完成相同的操作(如果出于其他目的需要它):

keypaths

请注意,此备选方案仅在您的所有值均为def keypaths(myDict): for key, value in myDict.items(): if isinstance(value, collections.Mapping): for subkey, subvalue in keypaths(value): yield [key] + subkey, subvalue else: yield [key], value my_dict = {i: keypath for keypath, value in keypaths(sample) for i in value} 时才起作用(否则字典理解将失败)。

<强>输出:

list

请注意,这仅适用于假设您的所有值均为{'a1': ['PROJ1', 'LOB1'], 'a2': ['PROJ1', 'LOB1'], 'aa1': ['PROJ12', 'LOBa'], 'aa2': ['PROJ12', 'LOBa'], 'b1': ['PROJ1', 'LOB'], 'b2': ['PROJ1', 'LOB'], 'n1': ['PROJ1', 'LOBX'], 'n2': ['PROJ1', 'LOBX'], 'o1': ['PROJ1', 'LOBA'], 'o2': ['PROJ1', 'LOBA'], 'o3': ['PROJ1', 'LOBA'], 'oa': ['PROJ1', 'LOBA'], 'v1': ['PROJ1', 'LOb2'], 'v2': ['PROJ1', 'LOb2'], 'vx1': ['PROJ12', 'LOBX'], 'vx2': ['PROJ12', 'LOBX']} s(否则字典理解将失败),并且具有唯一值(否则将覆盖重复路径的键路径)。

现在你需要做的就是获得list

keypath