python - 根据字典中的两个值比较多个字典的条目
问题描述
我有两个 python 字典,我需要一种有效的方法来迭代一个字典,检查每个条目的多个值与另一个字典。如果该条目不存在,我需要将该条目从一个字典添加到源字典。
我尝试了不同的方法,例如 itter() 对两个字典值并使用“in”来查看值是否存在,但逻辑在某处被破坏。
for key, value in export_data.iteritems():
if value['computer_id'] and value['computer_name'] in import_data.iteritems():
如果computer_id
并且computer_name
在import_data
则继续,如果不是则将缺少的字典项从 import_data 添加到 export_data 字典。
在下面的示例数据中,“ import_data
”有一个额外的项目“ host-c
”,我希望将其添加到 export_data 字典中。
我遇到困难的部分是“host-g”还有一条记录,但computer_id与export_data中的host-a相同,所以我不想添加该条目。
只有 computer_name 和 computer_id 不同的唯一项目。
示例数据:
export_data =
{u'host-a': {'computer_id': [u'6353a65387'], 'computer_name': ['host-a'], 'first_observed': ['Wed Jul 24 13:57:56 2019']}, {u'host-b': {'computer_id': [u'635365d387'], 'computer_name': ['host-b'], 'first_observed': ['Wed Jul 24 13:57:56 2019']}
import_data =
{u'host-a': {'computer_id': [u'6353a65387'], 'computer_name': ['host-a'], 'first_observed': ['Wed Jul 24 13:57:56 2019']}, {u'host-b': {'computer_id': [u'635365d387'], 'computer_name': ['host-b'], 'first_observed': ['Wed Jul 24 13:57:56 2019']},{u'host-c': {'computer_id': [u'6353654d387'], 'computer_name': ['host-c'], 'first_observed': ['Wed Jul 24 13:57:56 2019']},{u'host-g': {'computer_id': [u'6353a65387'], 'computer_name': ['host-g'], 'first_observed': ['Wed Jul 24 13:57:56 2019']}
解决方案
我认为没有办法遍历两个字典并手动比较值。试验你的代码我得到了这个:
export_data = {
u'host-a': {
'computer_id': [u'6353a65387'],
'computer_name': ['host-a'],
'first_observed': ['Wed Jul 24 13:57:56 2019']
},
u'host-b': {
'computer_id': [u'635365d387'],
'computer_name': ['host-b'],
'first_observed': ['Wed Jul 24 13:57:56 2019']
}
}
import_data = {
u'host-a': {
'computer_id': [u'6353a65387'],
'computer_name': ['host-a'],
'first_observed': ['Wed Jul 24 13:57:56 2019']
},
u'host-b': {
'computer_id': [u'635365d387'],
'computer_name': ['host-b'],
'first_observed': ['Wed Jul 24 13:57:56 2019']
},
u'host-c': {
'computer_id': [u'6353654d387'],
'computer_name': ['host-c'],
'first_observed': ['Wed Jul 24 13:57:56 2019']
},
u'host-g': {
'computer_id': [u'6353a65387'],
'computer_name': ['host-g'],
'first_observed': ['Wed Jul 24 13:57:56 2019']
}
}
print(export_data)
additional_export_data = []
for im_key, im_value in import_data.items():
found_in_export = False
for ex_key, ex_value in export_data.items():
if ex_value['computer_id'][0] == im_value['computer_id'][0] and ex_value['computer_name'][0] == im_value['computer_name'][0]:
found_in_export = True
if not found_in_export:
additional_export_data.append((im_key, im_value))
print(im_key, im_value['computer_id'][0])
print("")
for key, value in additional_export_data:
export_data[key] = value
print(export_data)
如果没有与相同的条目,这将添加键值对 fromimport_data
到。export_data
export_data
computer_id
computer_name
我也不知道为什么你的export_data
结构import_data
是这样的。字典的键与computer_name
值相同。和都是一个列表computer_id
,即使它对我computer_name
来说first_observed
没有意义。
也许您有理由以这种方式构建数据,但如果不是,我建议您执行以下操作:
- 摆脱
computer_name
子词典 - 将 和 的值存储为字符串,
computer_id
而first_observed
不是列表中的字符串
如果这样做,代码如下所示:
export_data = {
u'host-a': {
'computer_id': u'6353a65387',
'first_observed': 'Wed Jul 24 13:57:56 2019'
},
u'host-b': {
'computer_id': u'635365d387',
'first_observed': 'Wed Jul 24 13:57:56 2019'
}
}
import_data = {
u'host-a': {
'computer_id': u'6353a65387',
'first_observed': 'Wed Jul 24 13:57:56 2019'
},
u'host-b': {
'computer_id': u'635365d387',
'first_observed': 'Wed Jul 24 13:57:56 2019'
},
u'host-c': {
'computer_id': u'6353654d387',
'first_observed': 'Wed Jul 24 13:57:56 2019'
},
u'host-g': {
'computer_id': u'6353a65387',
'first_observed': 'Wed Jul 24 13:57:56 2019'
}
}
print(export_data)
additional_export_data = []
for im_key, im_value in import_data.items():
found_in_export = False
for ex_key, ex_value in export_data.items():
if ex_value['computer_id'] == im_value['computer_id'] and ex_key == im_key:
found_in_export = True
if not found_in_export:
additional_export_data.append((im_key, im_value))
print(im_key, im_value['computer_id'])
print("")
for key, value in additional_export_data:
export_data[key] = value
print(export_data)
推荐阅读
- javascript - 无法在浏览器中获取 angularJS 的输出
- css - 将段落宽度限制为标题宽度
- javascript - 我可以将我的 jQuery 代码拆分为 2 个 .js 文件吗?
- reactjs - 侧边菜单反应原生
- html - 如何在 Windows 上运行超轻量级?
- reactjs - 使用 React 时图像未加载
- angular - 注销功能无法正常工作。点击3到4次后才能正常工作。最初它只是重新加载页面但不注销
- reactjs - React Hook , setvariable 和 print 使用效果相同
- grep - 如何搜索在特定日期之间修改的 Linux 文件的内容
- r - R中包含向量的复数