【问题标题】:compare two dictionary and update value in first dictionary比较两个字典并更新第一个字典中的值
【发布时间】:2020-07-19 19:34:32
【问题描述】:

我对 python dict update 有疑问。我有两个字典,如下所述。

    dict1={1:{"partname": 'part1_item1' , 'archname':'sca_item1_rev1.0.jar','rev: '1.0', 'compname': item1},
           2:{"partname": 'part1_item2' , 'archname':'sca_item2_rev2.0.jar','rev: '2.0' ,'compname': item2},
           3:{"partname": 'part1_item3' , 'archname':'sca_item3_rev2.0.jar','rev: '2.0' ,'compname': item3}}
           
    dict2={item1:{'jarversion': '1.0', 'jarname':'item1', 'partition': 'item1'},
           item2:{'jarversion': '1.0', 'jarname':'item2', 'partition': 'item2'},
           item1:{'jarversion': '2.0', 'jarname':'item3', 'partition': 'item3'}}
    

我想比较 dict1 和 dict2 的值(rev 和 jarname),如果 jatname 和 jar 版本相同,那么我需要在 dict1 中更新 'overwrite': 'true'

如果两个版本不相同且未找到版本,我需要在 dict1 中使用 'overwrite': 'false' 进行更新

尝试使用 dict1 创建代码,如下所述

i=1
for root, dirs, files in os.walk(comp):
    if files:
        if i not in dict1.keys():
            dict1[i] = {}
        if '\\' in root:
            subdir=root.split('\\')[1]
        else:
            subdir=''
        dict1[i].update({"partname" : '', "archname": '', "compname":'', "rev": ''})
        if subdir:
            dict1[i].update({"partname" : '%s'%subdir })
            dict1[i].update({"archname": '', "compname":'', "rev": ''})
        for filename in files:
            if filename.endswith('.jar'):
                dict1[i].update({"archname": '%s'%filename,"compname": ('%s' %filename).split('sca_')[1].split('_rev')[0],"rev": ('%s' %filename).split('sca_')[1].split('_rev')[1].split('.jar')[0]})
            else:
                print("Unrecognised file: %s"%(filename))
        i=i+1

dict2 已经创建。

我需要用以下格式更新我的字典。

if dict1(compname)(rev) == dict2 (jarversion)(jarname)
    
    dict1={1:{"partname": 'part1_item1' , 'archname':'sca_item1_rev1.0.jar','rev: '1.0', 'compname': item1 , 'overwrite' :'true'}}
    
if dict1(compname)(rev) != dict2 (jarversion)(jarname)
    
    dict1={1:{"partname": 'part1_item1' , 'archname':'sca_item1_rev1.0.jar','rev: '1.0', 'compname': item1 , 'overwrite' :'false'}}
    

请帮助我如何使用此键更新 dict:values。

【问题讨论】:

  • 您可能需要修复 dict2 重复密钥的位置。

标签: python dictionary


【解决方案1】:

让我们试试这个,

# create a look-up set for unique (jarname + jarversion)
look_up = {v['jarname'] + v['jarversion'] for k, v in dict2.items()}

# use dict-comprehension for updating the values back to dict1
print(
    {k: {**v, **{"overwrite": v['compname'] + v['rev'] in look_up}}
     for k, v in dict1.items()}
)

EDIT,旧版python

look_up = set()

for _, v in dict2.items():
    look_up.add(v['jarname'] + v['jarversion'])

for k, v in dict1.items():
    dict1[k].update(
        {"overwrite": str(v['compname'] + v['rev'] in look_up).lower()}
    )

【讨论】:

  • 非常感谢。这是非常有用的代码。我猜这两个字典上都没有重复值。
  • 是的。我已经替换了正确的值..但是你能告诉我我在哪里可以把这个 dict 全面..在中间或最后..我都试过了,但医生没有更新
  • 覆盖结果:True 表明我想将这个转换为“真”。
  • 我想用这个更改来更新 dict1。如何使用此更新 dict1
  • 苏珊特。我在我的笔记本电脑上测试了这段代码。它的 py 3.7 工作正常。但我的测试机器有 py 2.6.6。版本。因此这个字典理解显示无效的语法显示你能帮忙把这个字典理解代码转换成 2.6.6 ..这对我真的很有帮助
猜你喜欢
  • 2022-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多