Python中如何解决列表内字典的组合问题?

list1 = [{‘id’:1,‘name’:‘one’},{‘id’:2,‘name’:‘two’}]
list2 = [{‘id’:1,‘age’:18},{‘id’:2,‘age’:17}]

list3 = [{‘id’:1,‘name’:‘one’,‘age’:18},{‘id’:2,‘name’:‘two’,‘age’:17}]
我现在想通过 list1 和 list2 获取 list3 最好的办法是什么
有没有像 mysql 一样的连接功能?
感觉用遍历挨个拼接很蠢,求解决办法
Python中如何解决列表内字典的组合问题?

11 回复

我记得世界上最好的语言有处理这个的函数,不知道 Py 有没有。
# 这个办法好像也很蠢:doge:。
python<br>list3 = []<br>for i, j in zip(list1, list2):<br> i.update(j)<br> list3.append(i)<br>


这个问题在数据处理里挺常见的,比如你有两个列表,里面都是字典,想按某个键的值把它们组合起来。最直接的办法就是用字典推导式或者循环。

假设你有两个字典列表,想按'id'这个键来匹配组合:

list1 = [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}]
list2 = [{'id': 1, 'age': 30}, {'id': 2, 'age': 25}]

# 先把第二个列表转换成按id索引的字典,这样查找快
list2_by_id = {item['id']: item for item in list2}

# 然后遍历第一个列表,合并数据
result = []
for item1 in list1:
    combined = item1.copy()  # 避免修改原数据
    matching_item = list2_by_id.get(item1['id'])
    if matching_item:
        combined.update(matching_item)
    result.append(combined)

print(result)
# 输出: [{'id': 1, 'name': 'Alice', 'age': 30}, {'id': 2, 'name': 'Bob', 'age': 25}]

如果两个列表里字典的键有重复,后面update的会覆盖前面的,这点要注意。如果id不是唯一键或者有多个匹配规则,那逻辑会更复杂些,可能得用嵌套循环或者itertools.product

简单说就是先建立索引再合并。

听朋友说 pandas 里面好像有处理这种数据的方法 这在找。。。。

按 id ?那把 id 当 key 扔字典里,遍历一遍 update 就行了呗

然后再整成 list。或者直接用 list,id 当索引(范围可控的话,不可控就存个 id 到 list 的索引)

不会比 pandas 差。

定义 namebuff 和 agebuff 一维数组,用 id 作为序号索引。更新数据只需要把提取的 list 组合进去就好

直接上代码
def func(l): return {e[‘id’]: e for e in l}
l1 = [{‘id’: 1, ‘name’: ‘one’}, {‘id’: 2, ‘name’: ‘two’}]
l2 = [{‘id’: 1, ‘age’: 18}, {‘id’: 2, ‘age’: 17}]

d1, d2 = func(l1), func(l2)

l3 = list(dict(d1[i].items() | d2[i].items())
for i in d1.keys() & d2.keys())

用列表推导式?不过其实也是嵌套的 for 循环,,
[{‘id’: item1[‘id’], ‘name’: item1[‘name’], ‘age’: item2[‘age’]} for item1 in list1 for item2 in list2 if item1[‘id’] == item2[‘id’]]

print(list1, list2)
list3 = copy.copy(list1)
[x[0].update(x[1]) for x in zip(list3, list2)]
print(list3)

result = []
index = {}
c = 0

for i in list1+list2:
index[i[‘id’]] = c
if not resut[c]:
result[c] = i
else:
result[c].update(i)
c++

<br>pd.merge(left=pd.DataFrame(list1), right=pd.DataFrame(list2),left_on='id', right_on='id').to_dict('records')<br>

回到顶部