有没有更好的方法来合并Python中两个列表中包含的字典?

时间:2016-04-06 13:59:56

标签: python list

我有两个包含词典的列表:

list_a:

[{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test1'},....]

list_b:

[{'id': 1, 'age': 10}, {'id': 2, 'age': 20}, ....]

我想合并这两个列表,结果为:

[{'id': 1, 'name': 'test', 'age': 10}, {'id': 2, 'name': 'test1', 'age': 20}....]

我想使用嵌套循环来实现它:

result= []
for i in list_a:
   for j in list_b:
     if i['id'] == j['id']:
      i['age']=j['age']
      result.append(i)

但是list_a有2000个元素,list_b的id属于list_a,但list_b的计数可能小于2000.这个方法的时间复杂度太高,有更好的方法来合并它们吗? / p>

5 个答案:

答案 0 :(得分:1)

不是,但dict.setdefaultdict.update可能是你的朋友。

data = {}
lists = [
   [{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test1'},],
   [{'id': 1, 'age': 10}, {'id': 2, 'age': 20},]
]

for each_list in lists:
   for each_dict in each_list:
       data.setdefault(each_dict['id'], {}).update(each_dict)

结果:

>>> data
{1: {'age': 10, 'id': 1, 'name': 'test'},
 2: {'age': 20, 'id': 2, 'name': 'test1'}}

这样你就可以通过id进行查找(如果你想要一个简单的列表,你只需要获取data.values())。自从我学习算法课以来已经20年了,但是我猜这很接近于O(n),而你的样本更多是O(n²)。这个解决方案有一些有趣的属性:不改变原始列表,适用于任意数量的列表,适用于包含不同“id”集的不均匀列表。

答案 1 :(得分:0)

answer = {}
for d in list_a: answer[d['id']] = d

for d in list_b:
    if d['id'] not in d:
        answer[d['id']] = d
        continue
    for k,v in d.items():
        answer[d['id']][k] = v

answer = [d for k,d in sorted(answer.items(), key=lambda s:s[0])]

答案 2 :(得分:0)

不,我认为这是最好的方法,因为您加入了最简单的数据结构中的所有数据。

您可以知道如何实施它here

我希望我的回答能对你有所帮助。

答案 3 :(得分:0)

可以在一行中完成,因为list1和list2中的项目顺序相同,我的意思是id明智。

result = [item1 for item1, item2 in zip(list1, list2) if not item1.update(item2)]

更长的一个

for item1, item2 in zip(list1, list2):
    item1.update(item2)
    # list1 will be mutated to the result

答案 4 :(得分:0)

要找到更好的方法,需要知道如何生成值以及如何使用它们。

例如,如果您将它们作为csv个文件,则可以使用类似表格的模块,例如pandas(我会在您的列表中创建它们,但它们有read_csvfrom_csv以及:{/ p>

import pandas as pd
df1 = pd.DataFrame.from_dict([{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test1'}])
df2 = pd.DataFrame.from_dict([{'id': 1, 'age': 10}, {'id': 2, 'age': 20}])
pd.merge(df1, df2, on='id')

enter image description here

或者,如果它们来自数据库,则大多数数据库已经有JOIN ON(例如MYSQL)选项。