一、前言
最近有粉丝咨询了一个问题,他现在有两个列表,它们里面的元素都为字典,而且字典都有一个键名称为
id
,现在想把这两个字典中相同
id
的字典元素合并为一个字典,类似下面的效果:
两个列表的数据:
a_list =[{'id':1,'value':11},{'id':2,'value':22},{'id':3,'value':33}]
b_list =[{'id':1,'name':'a'},{'id':2,'name':'b'},{'id':3,'name':'c'}]
期望合并的结果
[{'id':1,'name':'a','value':11},{'id':2,'name':'b','value':22},{'id':3,'name':'c','value':33}]
(PS:个人在用的人工智能学习网站推荐给需要的小伙伴:captainai )
二、具体实现分析
这是粉丝写的实现代码:
for i inrange(len(b_list)):for a in a_list:if b_list[i]['id']== a['id']:
b_list[i]['value']= a['value']print(b_list)
通过两个for循环来将
a_list
中元素字典
id
值等于
b_list
元素字段
id
值的值加入到对应的
b_list
元素字典中。
实际上两行代码就可以解决这个问题:
1.我们可以先通过推导式将
a_list
重新组装为
{id:value}
的形式
a_values ={a['id']: a['value']for a in a_list}
a_values的值为:
{1:11,2:22,3:33}
2.然后再通过推导式和字典解构再合并的方式将值与
b_list
重新组装:
res_list =[{**b,**{'value': a_values[b['id']]}}for b in b_list]
组装后的列表值为:
res_list的值为:
[{'id':1,'name':'a','value':11},{'id':2,'name':'b','value':22},{'id':3,'name':'c','value':33}]
完整示例代码:
a_list =[{'id':1,'value':11},{'id':2,'value':22},{'id':3,'value':33}]
b_list =[{'id':1,'name':'a'},{'id':2,'name':'b'},{'id':3,'name':'c'}]
a_values ={a['id']: a['value']for a in a_list}
res_list =[{**b,**{'value': a_values[b['id']]}}for b in b_list]print('res_list的值为:', res_list)
当然一行代码也可以搞定,直接把两个推导式合并“”
res_list =[{**b,**{'value':{a['id']: a['value']for a in a_list}[b['id']]}}for b in b_list]
但这就是为了装X而写代码了,毫无必要!
三、总结
上述代码使用了推导式和
**
解构字典来合并这两个知识点,他们都是非常常用的技巧,小伙伴们可以花时间去学习一下,能够让代码变得更加简洁。
👇🏻欢迎关注公众号【曲鸟讲测试开发】,获取最新教程,面试经验、Python知识分享👇🏻
版权归原作者 曲鸟 所有, 如有侵权,请联系我们删除。