我有两个包含词典的列表:
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>
答案 0 :(得分:1)
不是,但dict.setdefault
和dict.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)
答案 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_csv
和from_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')
或者,如果它们来自数据库,则大多数数据库已经有JOIN ON
(例如MYSQL)选项。