Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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_Python 3.x_Dictionary - Fatal编程技术网

Python 根据一个dict的结构(骨架)和另一个dict的相应值创建嵌套字典

Python 根据一个dict的结构(骨架)和另一个dict的相应值创建嵌套字典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,假设我有一个dictionary,名为dict1,它具有我想要的新字典的骨架(顺序和嵌套深度)。例如: dict1 = { "Personnel": { "Performance": "" }, "Gaming": { "Status": "", "Bug Status": "" }, "Compatible": { "Minimum": "", "Integrity": "", "Scalin

假设我有一个dictionary,名为
dict1
,它具有我想要的新字典的骨架(顺序和嵌套深度)。例如:

dict1 = {
   "Personnel": {
      "Performance": ""
   },
   "Gaming": {
      "Status": "",
      "Bug Status": ""
   },
   "Compatible": {
      "Minimum": "",
      "Integrity": "",
      "Scaling": ""
   },
   "Comparison": {
      "Difference": {
         "DirectX": ""
      },
      "Vendor": {
         "Intel": "",
         "Xiaomi": ""
      }
   }
}
new_dict = {k: {v_k: dict2[k][v_k] for v_k in v_dict} for k, v_dict in dict1.items() }
我还有另一个字典,名为
dict2
,它的值与上面
dict1
字典中的键对应,还有一些额外的键值对,如下所示:

dict2 = {
   "Personnel": {
      "Performance": "10.5",
      "Maximum": "50.5"
   },
   "Gaming": {
      "Status": "Cool",
      "Bug Status": "None",
      "Green Status": "Black"
   },
   "Compatible": {
      "Minimum": "5",
      "Integrity": "Yes",
      "Scaling": "No"
   },
   "Comparison": {
      "Difference": {
         "DirectX": "50",
         "Android": "70"
      },
      "Vendor": {
         "Xiaomi": "40"
      }
   },
   "Another property": {
      "Testinfo": "TestTest",
      "Important": {
         "Wow": "MuchDoge"
      }
   }
}
我想创建一个新字典,其中包含来自
dict1
的框架和从
dict2
获取的键的相应值

注意:我想跳过不属于
dict1
部分的键:值对。例如:在我的新字典中,我不需要“绿色状态”:“黑色”

下面是我尝试的代码:

def update(dict1 : dict, dict2: dict):  
    new_data = {}
    for k, v in dict1.items():
        if isinstance(v, dict):
            v = update(v, dict(dict2.keys()))
        if v not in dict2.keys():
            new_data[k] = v
    return new_data
但是我完全遗漏了一些东西。

您可以使用嵌套字典理解来实现这一点。迭代
dict1.items()
以获得
(键、值)
对的类型。再次迭代上一操作中的
value
dict以获取嵌套新dict所需的键。然后,从
dict2
中获取相应的键值。例如:

dict1 = {
   "Personnel": {
      "Performance": ""
   },
   "Gaming": {
      "Status": "",
      "Bug Status": ""
   },
   "Compatible": {
      "Minimum": "",
      "Integrity": "",
      "Scaling": ""
   },
   "Comparison": {
      "Difference": {
         "DirectX": ""
      },
      "Vendor": {
         "Intel": "",
         "Xiaomi": ""
      }
   }
}
new_dict = {k: {v_k: dict2[k][v_k] for v_k in v_dict} for k, v_dict in dict1.items() }
如果
some\u key
键不存在,最好使用
dict.get('some\u key')
来处理异常。因此,上述词典理解表达式将变为:

new_dict = {k: {v_k: dict2.get(k, {}).get(v_k) for v_k in v_dict} for k, v_dict in dict1.items() }
如果
dict2
中不存在来自
dict1
的任何键,则将
None
存储为值

对于您的示例数据,上述代码将返回
new\u dict
,如下所示:

{
   "Compatible": {
      "Scaling": "No",
      "Minimum": "5",
      "Integrity": "Yes"
   },
   "Personnel": {
      "Performance": "10.5"
   },
   "Gaming": {
      "Status": "Cool",
      "Bug Status": "None"
   },
   "Comparison": {
      "Difference": {
         "Android": "70",
         "DirectX": "50"
      },
      "Vendor": {
         "Xiaomi": "40"
      }
   }
}

您可以将递归与
zip
一起使用:

from pprint import pprint
dict1 = {'Personnel':
     {'Performance': ''},
 'Gaming':
     {'Status': '',
      'Bug Status': ''},
 'Compatible':
     {'Minimum': '',
      'Integrity': '',
      'Scaling': ''},
 'Comparison':
     {'Difference':
          {'DirectX': ''},
      'Vendor':
          {'Intel': '',
           'Xiaomi': ''}
      }
 }

dict2 = {'Personnel':
         {'Performance': '10.5',
          'Maximum': '50.5'},
     'Gaming':
         {'Status': 'Cool',
          'Bug Status': 'None',
          'Green Status': 'Black',
          },
     'Compatible':
         {'Minimum': '5',
          'Integrity': 'Yes',
          'Scaling': 'No'},
     'Comparison':
         {'Difference':
              {'DirectX': '50',
               'Android': '70'},
          'Vendor':
              { 'Xiaomi': '40'}

          },
     'Another property':
         {
             'Testinfo': 'TestTest',
             'Important': {
                 'Wow': 'MuchDoge'
             }
         }
     }

def update(h, j):
   return {a:d if (a == c and not isinstance(b, dict)) or not isinstance(b, dict) or not isinstance(d, dict) else update(b.items(), d.items()) for (a, b), (c, d) in zip(h, j)}

pprint(update(dict1.items(), dict2.items()))
输出:

{'Comparison': {'Difference': 'TestTest', 'Vendor': {'Intel': 
'MuchDoge'}},
'Compatible': {'Integrity': 'Yes', 'Minimum': '5', 'Scaling': 'No'},
'Gaming': {'Bug Status': {'Xiaomi': '40'},
           'Status': {'Android': '70', 'DirectX': '50'}},
'Personnel': {'Performance': '10.5'}}