将字典列表与特定值匹配相结合
Combine lists of dictionaries with specific value matches
给定 a_list 和 b_list 在 python 中,我想合并它们以便结果是 c_list.
在下面的示例中,只想合并具有与 'code' 键匹配的 'A' 的元素。
a_list = [{'code': 'A', 'foo_sum': 1}, {'code': 'B', 'foo_sum': 2}]
b_list = [{'code': 'A', 'bar_sum': 3}]
c_list = [{'code': 'A', 'foo_sum': 1, 'bar_sum': 3}, {'code': 'B', 'foo_sum': 2}]
我想用numpy,但是不能用,因为它不一定匹配元素长度和顺序。
并且,我试图在迭代过程中确定这一点,但无法实现使其成为 c,因为局部变量在理解符号中不可用。
for a in b_list:
if any(b["code"] == a["code"] for i, b in enumerate(b_list):
# want to use i variable, but not dified.
a["bar_sum"] = b_list[i]["code"]
你可以试试
- 合并两个列表
- 按
code
键对合并列表排序,然后按 code
分组
- 将分组中的字典列表合并为一个字典
from itertools import groupby
from collections import ChainMap
c_list = a_list + b_list
c_list = sorted(c_list, key=lambda d: d.get('code'))
res = [dict(ChainMap(*group)) for key, group in groupby(c_list, lambda d: d.get('code'))]
print(res)
[{'code': 'A', 'bar_sum': 3, 'foo_sum': 1}, {'code': 'B', 'foo_sum': 2}]
另一个解决方案:
a_list = [{"code": "A", "foo_sum": 1}, {"code": "B", "foo_sum": 2}]
b_list = [{"code": "A", "bar_sum": 3}]
out = {}
for d in a_list + b_list:
out[d["code"]] = {**out.get(d["code"], {}), **d}
print(list(out.values()))
打印:
[{"code": "A", "foo_sum": 1, "bar_sum": 3}, {"code": "B", "foo_sum": 2}]
给定 a_list 和 b_list 在 python 中,我想合并它们以便结果是 c_list.
在下面的示例中,只想合并具有与 'code' 键匹配的 'A' 的元素。
a_list = [{'code': 'A', 'foo_sum': 1}, {'code': 'B', 'foo_sum': 2}]
b_list = [{'code': 'A', 'bar_sum': 3}]
c_list = [{'code': 'A', 'foo_sum': 1, 'bar_sum': 3}, {'code': 'B', 'foo_sum': 2}]
我想用numpy,但是不能用,因为它不一定匹配元素长度和顺序。
并且,我试图在迭代过程中确定这一点,但无法实现使其成为 c,因为局部变量在理解符号中不可用。
for a in b_list:
if any(b["code"] == a["code"] for i, b in enumerate(b_list):
# want to use i variable, but not dified.
a["bar_sum"] = b_list[i]["code"]
你可以试试
- 合并两个列表
- 按
code
键对合并列表排序,然后按code
分组
- 将分组中的字典列表合并为一个字典
from itertools import groupby
from collections import ChainMap
c_list = a_list + b_list
c_list = sorted(c_list, key=lambda d: d.get('code'))
res = [dict(ChainMap(*group)) for key, group in groupby(c_list, lambda d: d.get('code'))]
print(res)
[{'code': 'A', 'bar_sum': 3, 'foo_sum': 1}, {'code': 'B', 'foo_sum': 2}]
另一个解决方案:
a_list = [{"code": "A", "foo_sum": 1}, {"code": "B", "foo_sum": 2}]
b_list = [{"code": "A", "bar_sum": 3}]
out = {}
for d in a_list + b_list:
out[d["code"]] = {**out.get(d["code"], {}), **d}
print(list(out.values()))
打印:
[{"code": "A", "foo_sum": 1, "bar_sum": 3}, {"code": "B", "foo_sum": 2}]