如何在Python中合并字典(json)列表?

2024-05-16 20:56:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个从JSON获得的字典列表:第一个是所有对象的列表,第二个列表是name=Disk的对象:

list_of_dicts1 = [
 {u'id' : u'111',
  u'host' : u'host01',
  u'name' : u'Disk'},

 {u'id' : u'222',
  u'host' : u'host02',
  u'name' : u'Disk'},

 {u'id' : u'333',
  u'host' : u'host02',
  u'name' : u'CPU'}
]

list_of_dicts2 = [
 {u'id' : u'111',
  u'host' : u'host01',
  u'name' : u'Disk'},

 {u'id' : u'444',
  u'host' : u'host02',
  u'name' : u'Disk'},

 {u'id' : u'555',
  u'host' : u'host03',
  u'name' : u'Disk'}
]

我想:

仅当“host”和“name”与list_of_dicts2匹配时,用list_of_dicts2中的id更新list_of_dicts2的id

如果没有具有“host”和“name”的对象,则将对象从list\u-dicts2添加到list\u-dicts1

结果:

^{pr2}$

有办法吗?在


Tags: of对象nameidjsonhost列表字典
3条回答
def mergeLists(list1,list2):
    out = []
    for item1 in list1:
        #find match in list 2 which has same host and item
        match = filter(lambda x:x['host'] == item1['host'] and x['name'] == item1['name'],list2)
        if len(match) > 0:
            #if match found use entry from list 2
            out.append(match[0])
        else:
            #else use item from list 1 as it is unique
            out.append(item1)
    #lastly, add unique entries from list2
    return {v['host']+v['name']:v for v in out+list2}.values()

你可以试试这个:

new_list_of_dicts1 = [{a:[c['id'] if c['name'] == i['name'] and c['host'] == i['host'] else i['id'] for c in list_of_dicts2][0] if a == 'id' else b for a, b in i.items()} for i in list_of_dicts1]+[i for i in list_of_dicts2 if not any(b['id'] == i['id'] for b in list_of_dicts1)]

输出:

^{pr2}$

您可以将这些dict列表映射到dict的dict,然后将update一个映射到另一个:

>>> list1_as_dict = collections.OrderedDict(((d["host"],d["name"]), d) for d in list_of_dicts1)
>>> list1_as_dict.update({(d["host"], d["name"]): d for d in list_of_dicts2})
>>> list(list1_as_dict.values())
[{'name': 'Disk', 'id': '111', 'host': 'host01'},
 {'name': 'Disk', 'id': '444', 'host': 'host02'},
 {'name': 'CPU', 'id': '333', 'host': 'host02'},
 {'name': 'Disk', 'id': '555', 'host': 'host03'}]

或者更短,定义用于提取条目的函数;相同的结果:

^{pr2}$

其复杂性将是O(n)。在

相关问题 更多 >