在Python中合并两个没有id的字典列表

我有两个这样的字典列表:


list1 =[{doc:1,pos_ini:5,pos_fin:10},{doc:1,pos_ini:7,pos_fin:12},{doc:2,pos_ini:5,pos_fin:10},**{doc:7,pos_ini:5,pos_fin:10}**]


list2 =

[{doc:1,pos_ini:5,pos_fin:10},**{doc:1,pos_ini:6,pos_fin:7}**,{doc:1,pos_ini:7,pos_fin:12},{doc:2,pos_ini:5,pos_fin:10},**{doc:2,pos_ini:25,pos_fin:30}**]

list2有两个list1没有的元素,list1有一个list2没有的元素。


我需要list_result合并所有元素:


list_result =[{doc:1,pos_ini:5,pos_fin:10},**{doc:1,pos_ini:6,pos_fin:7}**,{doc:1,pos_ini:7,pos_fin:12},{doc:2,pos_ini:5,pos_fin:10},

**{doc:2,pos_ini:25,pos_fin:30}**,**{doc:7,pos_ini:5,pos_fin:10}**]

用Python做到这一点的最佳方法是什么?谢谢!


墨色风雨
浏览 177回答 4
4回答

喵喵时光机

您可以使用frozenset()将每个字典散列items()到字典中,然后简单地获取分配的值:list({frozenset(x.items()): x for x in list1 + list2}.values())或使用map()应用于集合理解:list(map(dict, {frozenset(x.items()) for x in list1 + list2}))甚至只使用列表理解:[dict(d) for d in {frozenset(x.items()) for x in list1 + list2}]这将产生无序的结果:[{'doc': 1, 'pos_fin': 10, 'pos_ini': 5}, {'doc': 1, 'pos_fin': 12, 'pos_ini': 7}, {'doc': 2, 'pos_fin': 10, 'pos_ini': 5}, {'doc': 7, 'pos_fin': 10, 'pos_ini': 5}, {'doc': 1, 'pos_fin': 7, 'pos_ini': 6}, {'doc': 2, 'pos_fin': 30, 'pos_ini': 25}]注意:如果需要订购,则可以collections.OrderedDict()在此处改用:from collections import OrderedDictlist(OrderedDict((frozenset(x.items()), x) for x in list1 + list2).values())给出以下有序结果:[{'doc': 1, 'pos_fin': 10, 'pos_ini': 5}, {'doc': 1, 'pos_fin': 12, 'pos_ini': 7}, {'doc': 2, 'pos_fin': 10, 'pos_ini': 5}, {'doc': 7, 'pos_fin': 10, 'pos_ini': 5}, {'doc': 1, 'pos_fin': 7, 'pos_ini': 6}, {'doc': 2, 'pos_fin': 30, 'pos_ini': 25}]

MM们

在Python中,有个内置的set集合对此非常适合。问题在于集合需要hashable元素,因此您必须将字典转换为元组集合:[dict(items) for items in set(tuple(sorted(d.items())) for d in (list1 + list2))]

桃花长相依

您可以根据这些值创建一个集合,而不是将其转换为可哈希对象(如元组)的字典:unique_list = set(tuple(dictionary.items())) for dictionary in list1 + list2)然后可以再次转换回字典和列表格式:l = []for item in unique_list:    l.append(dict(item))像上面的东西应该工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python