代码之家  ›  专栏  ›  技术社区  ›  KbiR

比较和更新字典?

  •  -5
  • KbiR  · 技术社区  · 6 年前

    我列了两本字典

    dict1 = [
        {'name':'Apple','lot':1234,'old_qty':100}, {'name':'Grape','lot':456,'old_qty':20}
    ] 
    
    dict2 = [
        {'name':'Apple','lot':1234,'new_qty':50}, {'name':'Grape','lot':456,'new_qty':30}
    ] 
    

    [{'name':'Apple','lot':1234,'old_qty':100, 'new_qty':50}, {'name':'Grape','lot':456,'old_qty':20,'new_qty':30}]
    

    我该怎么做?

    4 回复  |  直到 6 年前
        1
  •  0
  •   Mehrdad Pedramfar    6 年前

    也许你在找这个:

    result = [] 
    for i,j in zip(dict1, dict2):
        i.update(j)
        result.append(i)
    

    结果就是你想要的。

        2
  •  0
  •   Aida Omar RJEIBI    6 年前

    假设要合并两个同名dict,请尝试以下操作:

    dict1 = [{'name':'Apple','lot':1234,'old_qty':100},{'name':'Grape','lot':456,'old_qty':20}]
    dict2 = [{'name':'Apple','lot':1234,'new_qty':50},{'name':'Grape','lot':456,'new_qty':30}]
    
    z = []
    common_attr = 'name'
    for d1 in dict1:
        for d2 in dict2:
            if d1[common_attr] == d2[common_attr]:
                z.append({**d1, **d2})
    print(z)
    

    希望这有帮助:)

        3
  •  0
  •   BlackBeard    6 年前

    伊荷,你可能在找这样的东西(考虑到钥匙的价值) name lot 可以从其他字典中唯一地标识字典):

    dict1 = [{'name':'Apple','lot':1234,'old_qty':100},{'name':'Grape','lot':456,'old_qty':20}]
    dict2 = [{'name':'Apple','lot':1234,'new_qty':50},{'name':'Grape','lot':456,'new_qty':30}]
    
    dict3 = [d1 for d1 in dict1 for d2 in dict2 if d1["name"]==d2["name"] if d1["lot"]==d2["lot"] if not d1.update(d2)]
    
    print(dict3)
    
        4
  •  0
  •   vash_the_stampede    6 年前

    只是一层一层的 for 循环

    listc = lista[:] 
    
    for i in listb:
        for j in listc:
            if i['name'] == j['name']:
                for x in i:
                    if x not in j.keys():
                        j[x] = i[x]
    
    print(listc)
    
    (xenial)vash@localhost:~/python/stack_overflow$ python3.7 dicta_comp.py 
    [{'name': 'Apple', 'lot': 1234, 'old_qty': 100, 'new_qty': 50}, {'name': 'Grape', 'lot': 456, 'old_qty': 20, 'new_qty': 30}]