一、前言
今天有粉丝咨询了一个问题,他现在有两个列表,它们的元素都为字典,且字典都有一个key
为id,现在想把这两个字典根据id合并为一个字典,类型下面的效果:
两个列表的数据为:
1
2
|
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' }]
|
期望合并的结果
1
2
3
|
[{ 'id' : 1 , 'name' : 'a' , 'value' : 11 },
{ 'id' : 2 , 'name' : 'b' , 'value' : 22 },
{ 'id' : 3 , 'name' : 'c' , 'value' : 33 }]
|
二、实现分析
这是粉丝写的实现代码:
1
2
3
4
5
|
for i in range ( 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}
的形式
1
|
a_values = {a[ 'id' ]: a[ 'value' ] for a in a_list}
|
a_values的值为:
1
|
{1: 11, 2: 22, 3: 33}
|
2.然后再通过推导式和字典解构再合并的方式将值与b_list
重新组装:
1
|
res_list = [{ * * b, * * { 'value' : a_values[b[ 'id' ]]}} for b in b_list]
|
组装后的列表值为
1
2
3
4
|
res_list的值为:
[{ 'id' : 1 , 'name' : 'a' , 'value' : 11 },
{ 'id' : 2 , 'name' : 'b' , 'value' : 22 },
{ 'id' : 3 , 'name' : 'c' , 'value' : 33 }]
|
完整示例代码
1
2
3
4
5
|
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)
|
当然一行代码也可以搞定,直接把两个推导式合并
1
|
res_list = [{ * * b, * * { 'value' : {a[ 'id' ]: a[ 'value' ] for a in a_list}[b[ 'id' ]]}} for b in b_list]
|
但这就是为了装X而写代码了,毫无必要!
三、总结
就是推导式和字典通过**
解构来合并这两个知识点。
以上就是Python学习字典列表根据相同键的值进行合并的详细内容,更多关于Python字典列表键值合并的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/momoda118/article/details/120406132