【问题标题】:Compare multiple dictionaries for entry based on two values within dictionary根据字典中的两个值比较多个字典的条目
【发布时间】:2019-07-24 13:42:38
【问题描述】:

我有两个 python 字典,我需要一种有效的方法来迭代一个字典,检查每个条目与另一个字典的多个值。如果条目不存在,我需要将该条目从一个字典添加到源字典。

我尝试了不同的方法,例如对两个字典值使用 itter() 并使用“in”来查看值是否存在,但逻辑在某处被破坏。

for key, value in export_data.iteritems():
  if  value['computer_id'] and value['computer_name'] in import_data.iteritems():

如果 computer_idcomputer_nameimport_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']}

【问题讨论】:

  • 如果键在两者中都存在但值不同,您希望看到什么?
  • 你应该给出一个示例输入和预期输出。

标签: python dictionary compare


【解决方案1】:

我认为没有一种方法可以遍历两个字典并手动比较值。试验你的代码我得到了这个:

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)

如果export_data 中没有具有相同computer_id computer_name 的条目,这会将键值对从import_data 添加到export_data


我也不知道为什么你的export_dataimport_data 的结构是这样的。 字典的键与computer_name 的值相同。 computer_idcomputer_namefirst_observed 都是一个列表,尽管它对我来说没有意义。

也许您有理由以这种方式构建数据,但如果不是,我建议您执行以下操作:

  • 去掉子词典中的computer_name
  • computer_idfirst_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)

【讨论】:

  • 谢谢 Marv。非常感谢。
  • 感谢您的赞赏;)要向其他人表明您的问题已得到解答并且我的回答是正确的,您可以检查它旁边的勾号(在赞成票和反对票下)。这也会给你和我一些声誉:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2011-10-08
相关资源
最近更新 更多