匹配列表中多个字典的键值 Python

Match key value of multiple dictionaries inside list Python

我有一个包含多个词典的列表。这些词典中的每一个都有一个 ID。我需要找出哪些词典具有匹配的 ID 值。然后,我可以根据这两个词典的平均值创建一个新词典。

示例:

[
{'id': 123, 'conversions': 1.4227642276422763, 'cpc': 2.2357723577235773, 'cpm': 4.471544715447155, 'reach': 90.65040650406505}, 
{'id': 123, 'conversions': 1.4056224899598393, 'cpc': 2.208835341365462, 'cpm': 5.622489959839357, 'reach': 89.5582329317269},
{'id': 1234, 'conversions': 1.4056224899598393, 'cpc': 2.208835341365462, 'cpm': 5.622489959839357, 'reach': 89.5582329317269},
]

所以在这个例子中,id = 123 存在于两个词典中。所以我想创建一个新字典,它具有这两个字典的平均值,如下所示:

{'id': 123, 'conversions': 1.414166666, 'cpc': 2.2225462, 'cpm': 5.622489959839357, 'reach': 89.5582329317269}

请注意上面示例中的平均值并不完全正确。

我的做法是,我需要识别具有相似 ID 的词典,然后将它们分别存储在列表中。然后我可以使用以下内容来创建它们的平均值。

out = {k: mean(d[k] for d in lst) for k in lst[0]}
print(out)

我的问题是我无法识别它们并将它们存储在列表中。

谢谢

通过按 id:

分组将词典存储在单独的列表中
from collections import defaultdict

data = [
    {'id': 123, 'conversions': 1.4227642276422763, 'cpc': 2.2357723577235773, 'cpm': 4.471544715447155, 'reach': 90.65040650406505}, 
    {'id': 123, 'conversions': 1.4056224899598393, 'cpc': 2.208835341365462, 'cpm': 5.622489959839357, 'reach': 89.5582329317269},
    {'id': 1234, 'conversions': 1.4056224899598393, 'cpc': 2.208835341365462, 'cpm': 5.622489959839357, 'reach': 89.5582329317269},
]

same_ids = defaultdict(list)
for item in data:
    same_ids[item["id"]].append(item)

print(same_ids)

输出

{
    "123": [
        {
            "id": 123,
            "conversions": 1.4227642276422763,
            "cpc": 2.2357723577235773,
            "cpm": 4.471544715447155,
            "reach": 90.65040650406505
        },
        {
            "id": 123,
            "conversions": 1.4056224899598393,
            "cpc": 2.208835341365462,
            "cpm": 5.622489959839357,
            "reach": 89.5582329317269
        }
    ],
    "1234": [
        {
            "id": 1234,
            "conversions": 1.4056224899598393,
            "cpc": 2.208835341365462,
            "cpm": 5.622489959839357,
            "reach": 89.5582329317269
        }
    ]
}

现在它们已按 ID 分组,我们可以使用您的目标计算来计算每组的平均值。

from statistics import mean

keys_to_average = set(data[0].keys())
# keys_to_average.discard("id")  # To remove id from the result

for key, lst in same_ids.items():
    out = {k: mean(d[k] for d in lst) for k in keys_to_average}
    print(key, out)

输出

123 {'cpc': 2.2223038495445193, 'conversions': 1.4141933588010578, 'id': 123, 'reach': 90.10431971789598, 'cpm': 5.047017337643256}
1234 {'cpc': 2.208835341365462, 'conversions': 1.4056224899598393, 'id': 1234, 'reach': 89.5582329317269, 'cpm': 5.622489959839357}