Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.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查找dict和dict_键中的嵌套值以及交换值_Python_Dictionary_Lookup - Fatal编程技术网

Python查找dict和dict_键中的嵌套值以及交换值

Python查找dict和dict_键中的嵌套值以及交换值,python,dictionary,lookup,Python,Dictionary,Lookup,我正在尝试将字典(dic_-map)中的值与字典(B)中的值交换,其中dic_-map[key]=B dic_map = { 'Name': 'name', 'Id': 'guid', 'address':{ 'address1': 'road', 'address2': 'road_nr', 'address3': 'zipcode', 'address4': 'city' }, 'tax'

我正在尝试将字典(dic_-map)中的值与字典(B)中的值交换,其中dic_-map[key]=B

dic_map = {
    'Name': 'name',
    'Id': 'guid',
    'address':{
        'address1': 'road',
        'address2': 'road_nr',
        'address3': 'zipcode',
        'address4': 'city'
    },
    'tax': True,
    'isValid': False,
    'specific': 1,
    'credit': 200
}


B = {
    'name': 'Michael Jackson',
    'guid': '032-567-781',
    'road': 'The greatest Dr',
    'road_nr': 42,
    'zipcode': 90210,
    'city': 'Hollywood',
    'country': 'USA'
}
最后一句话呢

desired_result = {
    'Name': 'Michael Jackson',
    'Id': '032-567-781',
    'address':{
        'address1': 'The greatest Dr',
        'address2': 42,
        'address3': 90210,
        'address4': 'Hollywood',
    },
    'tax': True,
    'isValid': False,
    'specific': 1,
    'credit': 200
}
这就是我目前所拥有的

def swap_values(dic_values, dic_map):
    d = {}
    for k1 in dic_values.keys():
        for k2 in dic_map.keys():
            if k1 == dic_map[k2]:
                d[k2]=dic_values[k1]
            else:
                d[k2]=dic_map[k2]
    return d
据我所知,有两件事不起作用,一件。我的值被else语句覆盖,2。嵌套的dict永远不会被计算。任何帮助都将不胜感激。

以下是我得到的:

def dmap(template, values):
    for key, val in template.items():
        if isinstance(val, dict):
            dmap(val, values)
        else:
            if val in values:
                template[key] = values[val]
如果我运行
dmap(dic\u map,B)
我会得到:

{
  'Id': '032-567-781',
  'Name': 'Michael Jackson',
  'address': {
    'address1': 'The greatest Dr',
    'address2': 42,
    'address3': 90210,
    'address4': 'Hollywood'
  },
  'credit': 200,
  'isValid': False,
  'specific': 1,
  'tax': True
}

由于存在内部dict,我们必须对每个内部dict重复替换操作。执行此类任务的最简单方法是使用递归

验证类型不被认为是非常pythonic的,但它将完成任务。您可以这样做:

def swap_values(dic_values, dic_map):
    d = {}

    for k, v in dic_values.items():
        if isinstance(v, dict):
            d[k] = swap_values(v, dic_map)
        else:
            d[k] = dic_map.get(v, v)

    return d
示例用法:

>>> dic_map = {
...     'Name': 'name',
...     'Id': 'guid',
...     'address':{
...         'address1': 'road',
...         'address2': 'road_nr',
...         'address3': 'zipcode',
...         'address4': 'city'
...     },
...     'tax': True,
...     'isValid': False,
...     'specific': 1,
...     'credit': 200
... }
>>> 
>>> 
>>> B = {
...     'name': 'Michael Jackson',
...     'guid': '032-567-781',
...     'road': 'The greatest Dr',
...     'road_nr': 42,
...     'zipcode': 90210,
...     'city': 'Hollywood',
...     'country': 'USA'
... }
>>> swap_values(dic_map, B)
{'specific': 1, 'Name': 'Michael Jackson', 'credit': 200, 'address': {'address1': 'The greatest Dr', 'address2': 42, 'address4': 'Hollywood', 'address3': 90210}, 'isValid': False, 'tax': True, 'Id': '032-567-781'}
>>> dic_map = {
...     'Name': 'name',
...     'Id': 'guid',
...     'tax': True,
...     'isValid': False,
...     'specific': 1,
...     'credit': 200
... }
>>> 
>>> 
>>> B = {
...     'name': 'Michael Jackson',
...     'guid': '032-567-781',
...     'road': 'The greatest Dr',
...     'road_nr': 42,
...     'zipcode': 90210,
...     'city': 'Hollywood',
...     'country': 'USA'
... }
>>> swap_values(dic_map, B)
{'specific': 1, 'isValid': False, 'Name': 'Michael Jackson', 'Id': '032-567-781', 'tax': True, 'credit': 200}
如果没有内部指令,我们可以使用:

def swap_values(dic_values, dic_map):
    d = {}

    for k, v in dic_values.items():
        d[k] = dic_map.get(v, v)

    return d
示例用法:

>>> dic_map = {
...     'Name': 'name',
...     'Id': 'guid',
...     'address':{
...         'address1': 'road',
...         'address2': 'road_nr',
...         'address3': 'zipcode',
...         'address4': 'city'
...     },
...     'tax': True,
...     'isValid': False,
...     'specific': 1,
...     'credit': 200
... }
>>> 
>>> 
>>> B = {
...     'name': 'Michael Jackson',
...     'guid': '032-567-781',
...     'road': 'The greatest Dr',
...     'road_nr': 42,
...     'zipcode': 90210,
...     'city': 'Hollywood',
...     'country': 'USA'
... }
>>> swap_values(dic_map, B)
{'specific': 1, 'Name': 'Michael Jackson', 'credit': 200, 'address': {'address1': 'The greatest Dr', 'address2': 42, 'address4': 'Hollywood', 'address3': 90210}, 'isValid': False, 'tax': True, 'Id': '032-567-781'}
>>> dic_map = {
...     'Name': 'name',
...     'Id': 'guid',
...     'tax': True,
...     'isValid': False,
...     'specific': 1,
...     'credit': 200
... }
>>> 
>>> 
>>> B = {
...     'name': 'Michael Jackson',
...     'guid': '032-567-781',
...     'road': 'The greatest Dr',
...     'road_nr': 42,
...     'zipcode': 90210,
...     'city': 'Hollywood',
...     'country': 'USA'
... }
>>> swap_values(dic_map, B)
{'specific': 1, 'isValid': False, 'Name': 'Michael Jackson', 'Id': '032-567-781', 'tax': True, 'credit': 200}

我认为这对于递归来说是最简单的,这是不相关的,但是如果你想迭代键,你可以直接迭代
dict
。另外,不要重复您的
dic_值
,这会破坏使用
dict
的目的。但是,是的,你可能只是通过嵌套的dict进行递归。谢谢你让我走上了递归的轨道。