如何在json文件中获取父keypath?

2024-09-26 22:41:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,我们可以得到一个键的父键路径,我的json如下所示。。 例如,如果输入a1:PROJ1/LOB1。列表[]中的所有键都是唯一的

{
    '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)}

Tags: keyinforvaluea1dictmydictyield
1条回答
网友
1楼 · 发布于 2024-09-26 22:41:52

您需要深入查看返回值的list,以获得每个a1a2。。。等等。您可以对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}

注意,这个替代方法只适用于假设所有值都是lists的情况(否则字典理解就会失败)。你知道吗

输出:

{'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']}

注意,这只适用于假设所有值都是lists(否则字典理解会失败),并且具有唯一的值(否则会覆盖重复值的键路径)。你知道吗

现在,要获得keypath,您需要做的就是:

my_dict.get('a1')
# ['PROJ1', 'LOB1']

my_dict.get('o1')
# ['PROJ1', 'LOBA']

my_dict.get('not exist')
# None

相关问题 更多 >

    热门问题