匹配列表中多个字典的键值 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}
我有一个包含多个词典的列表。这些词典中的每一个都有一个 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}