python-3.x 按主键合并列表中的多个字典

bogh5gae  于 2022-12-27  发布在  Python
关注(0)|答案(3)|浏览(151)

以下问题:
我有很多字典,比如:

l = [{"primary_key": 5164, "attribute1": 2},
     {"primary_key": 5162, "attribute1": 3}, 
     {"primary_key": 5164, "attribute2": 3}]

我想把它们加入到一个输出列表中,但是合并具有相同主键的字典:

output_l = [{"primary_key": 5164, "attribute1": 2, "attribute2": 3},
            {"primary_key": 5162, "attribute1": 3}]

搜索了很多之后,我没有在其他地方找到这个问题。如果它是重复的,对不起。它与this question非常相关,但只有一个列表而不是多个。

krcsximq

krcsximq1#

创建一个字典,在其中按主键存储不断增长的字典。以下方法有效:

dicts = {}
for dct in l:
    dicts.setdefault(dct["primary_key"], {}).update(dct)

l = [*dicts.values()]
# [{'primary_key': 5164, 'attribute1': 2, 'attribute2': 3},
#  {'primary_key': 5162, 'attribute1': 3}]

注意共享属性名,最新的条目将“获胜”。

js4nwp54

js4nwp542#

下面是另一种方法:

l = [{"primary_key": 5164, "attribute1": 2},
     {"primary_key": 5162, "attribute1": 3}, 
     {"primary_key": 5164, "attribute2": 3},
     {"primary_key": 5162, "attribute2": 3},
     {"primary_key": 5163, "attribute1": 4}] 

# Final list
out_list = []

# Dict to maintain the position where particular primary key was inserted in out_list
visited_keys = {}
index = 0
for item in l:
    # If this key is already in out_list, update it with new key:value
    if item['primary_key'] in visited_keys.keys():
        out_list[visited_keys[item["primary_key"]]].update(item)
    else:
        # Key is not visited, so just append it to the out_list
        out_list.append(item)
        visited_keys[item["primary_key"]] = index
        index += 1
        
print (out_list)

输出:

[{'primary_key': 5164, 'attribute1': 2, 'attribute2': 3}, {'primary_key': 5162, 'attribute1': 3, 'attribute2': 3}, {'primary_key': 5163, 'attribute1': 4}]
c2e8gylq

c2e8gylq3#

from _collections import defaultdict
from operator import itemgetter

l = [{"primary_key": 64, "attribute1": 2},
     {"primary_key": 62, "attribute1": 3}, 
     {"primary_key": 64, "attribute2": 3}] 

def m1(l):
    d= defaultdict(dict)
    for innerdict in l :
        d[innerdict['primary_key']].update(innerdict)
    dv= d.values()
    dvsorted = sorted( d.values(),key = itemgetter('primary_key') )
    dvsorted1 = [*dvsorted]
    dvsorted1_print = print(dvsorted1)
    return dvsorted1_print

m1(l)
        
"""
Output :
[{'primary_key': 62, 'attribute1': 3}, {'primary_key': 64, 'attribute1': 2, 'attribute2': 3}]

"""

说明:
1.函数m1取字典列表作为输入。
1.该函数创建一个defaultdict,其中"primary_key"作为键,inndict作为值。
1.然后,该函数用inndict更新defaultdict。
1.然后,该函数按primary_key对defaultdict进行排序。
1.然后函数打印排序后的defaultdict。

相关问题