Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从键是引用词典子集的嵌套词典创建平面词典?_Python_Dictionary_Recursion_Generator_Indirection - Fatal编程技术网

Python 如何从键是引用词典子集的嵌套词典创建平面词典?

Python 如何从键是引用词典子集的嵌套词典创建平面词典?,python,dictionary,recursion,generator,indirection,Python,Dictionary,Recursion,Generator,Indirection,我正在创建一个嵌套引用字典来记录一个数据字典可能具有的所有可能的键以及对应的值,这些值是平面字典中要使用的所有键 数据字典的键始终是参考字典键的子集。平面字典的键始终是参考字典值集的子集 换句话说,给定一个参考词典,其赋值如下: reference['agent']['address'] = 'agentaddress' reference['agent']['zone']['id'] = 'agentzoneid' reference['eventid'] = 'eventid' refere

我正在创建一个嵌套引用字典来记录一个数据字典可能具有的所有可能的键以及对应的值,这些值是平面字典中要使用的所有键

数据字典的键始终是参考字典键的子集。平面字典的键始终是参考字典值集的子集

换句话说,给定一个参考词典,其赋值如下:

reference['agent']['address'] = 'agentaddress'
reference['agent']['zone']['id'] = 'agentzoneid'
reference['eventid'] = 'eventid'
reference['file']['hash'] = 'filehash'
reference['file']['name'] = 'filename'
nested['agent']['address'] = '172.16.16.16'
nested['eventid'] = '1234566778'
nested['file']['name'] = 'reallybadfile.exe'
flat['agentaddress'] = '172.16.16.16'
flat['eventid'] = '1234566778'
flat['filename'] = 'reallybadfile.exe'
def this(ref, nest, flat, *args):
    for (k,v) in reference:
        if type(v) is dict:
            this(?, ?, ?, ?)
        elif nested[path][to][k]:      
            flat[reference[path][to][k]] = nested[path][to][k]
还有一个数据字典,其赋值如下:

reference['agent']['address'] = 'agentaddress'
reference['agent']['zone']['id'] = 'agentzoneid'
reference['eventid'] = 'eventid'
reference['file']['hash'] = 'filehash'
reference['file']['name'] = 'filename'
nested['agent']['address'] = '172.16.16.16'
nested['eventid'] = '1234566778'
nested['file']['name'] = 'reallybadfile.exe'
flat['agentaddress'] = '172.16.16.16'
flat['eventid'] = '1234566778'
flat['filename'] = 'reallybadfile.exe'
def this(ref, nest, flat, *args):
    for (k,v) in reference:
        if type(v) is dict:
            this(?, ?, ?, ?)
        elif nested[path][to][k]:      
            flat[reference[path][to][k]] = nested[path][to][k]
代码应该生成一个字典,该字典可以这样分配:

reference['agent']['address'] = 'agentaddress'
reference['agent']['zone']['id'] = 'agentzoneid'
reference['eventid'] = 'eventid'
reference['file']['hash'] = 'filehash'
reference['file']['name'] = 'filename'
nested['agent']['address'] = '172.16.16.16'
nested['eventid'] = '1234566778'
nested['file']['name'] = 'reallybadfile.exe'
flat['agentaddress'] = '172.16.16.16'
flat['eventid'] = '1234566778'
flat['filename'] = 'reallybadfile.exe'
def this(ref, nest, flat, *args):
    for (k,v) in reference:
        if type(v) is dict:
            this(?, ?, ?, ?)
        elif nested[path][to][k]:      
            flat[reference[path][to][k]] = nested[path][to][k]
我永远不知道嵌套字典中的哪些字段将被填充,哪些不会,但我可以知道引用字典中的映射

我希望我需要使用递归将字典遍历到子字典中,并可能使用某种间接方法分别从参考字典值和嵌套字典键创建平面字典键和值

然而,我还不能生成任何有意义的代码

也许从一个非常高的层次来看,它可能看起来像这样:

reference['agent']['address'] = 'agentaddress'
reference['agent']['zone']['id'] = 'agentzoneid'
reference['eventid'] = 'eventid'
reference['file']['hash'] = 'filehash'
reference['file']['name'] = 'filename'
nested['agent']['address'] = '172.16.16.16'
nested['eventid'] = '1234566778'
nested['file']['name'] = 'reallybadfile.exe'
flat['agentaddress'] = '172.16.16.16'
flat['eventid'] = '1234566778'
flat['filename'] = 'reallybadfile.exe'
def this(ref, nest, flat, *args):
    for (k,v) in reference:
        if type(v) is dict:
            this(?, ?, ?, ?)
        elif nested[path][to][k]:      
            flat[reference[path][to][k]] = nested[path][to][k]
其中,
[path][to][k]
表示某种间接寻址的方法,
*args
是我要传递给递归函数的东西,这样我就有了一种方法,可以通过字典的嵌套性来访问我需要的键和值。

使用a,这相当简单:

代码: 测试代码: 结果:
@Stephernauch的答案很好,如果您不想使用生成器,只需按以下方式重新格式化即可:

# r=reference, n=nested, f=final
def buildDict(r, n, f):
    for key in n.keys():
        if isinstance(n[key], dict):
            buildDict(r.get(key), n[key], f)
        else:
            if r.get(key):
                f[r.get(key)] = n[key]

reference['agent']['address']='agentaddress'
将崩溃,除非分配了
reference['agent']
。然而,我在问题中没有看到这项任务。在你回答这个问题后,我意识到两件事:1。这就是我的问题和答案。我想问一个稍微不同的问题。嵌套字典也可能包含引用中不存在的值。在这种情况下,它们应该简单地从平面字典中省略。我发现我可以在您的解决方案中添加一行来完成此任务:在第一个for循环之后的行中:
如果k不在ref:
中,然后是
continue