平均字典列表的值

Average the values of a list of dictionaries

我有以下词典列表。每个字典都有一个 "Point" 和一个 "Value",从 110,对于每个 系列 点。

My_list = [{"Point": 1, "Value": 40}, {"Point": 2, "Value": 40}, {"Point": 3, "Value": 40}, \
{"Point": 4, "Value": 40}, {"Point": 5, "Value": 40}, {"Point": 6, "Value": 40}, \
{"Point": 7, "Value": 40}, {"Point": 8, "Value": 40}, {"Point": 9, "Value": 0},{"Point": 10, "Value": 250},\
    {"Point": 1, "Value": 40}, {"Point": 2, "Value": 40}, {"Point": 3, "Value": 40}, \
{"Point": 4, "Value": 40}, {"Point": 5, "Value": 40}, {"Point": 6, "Value": 40}, \
{"Point": 7, "Value": 40}, {"Point": 8, "Value": 40}, {"Point": 9, "Value": 0},{"Point": 10, "Value": 250},\
    {"Point": 1, "Value": 40}, {"Point": 2, "Value": 40}, {"Point": 3, "Value": 40}, \
{"Point": 4, "Value": 40}, {"Point": 5, "Value": 40}, {"Point": 6, "Value": 40}, \
{"Point": 7, "Value": 40}, {"Point": 8, "Value": 40}, {"Point": 9, "Value": 0},{"Point": 10, "Value": 250}]

我想找到每 2 个 'Point' 的平均值 'Value',而不会弄乱下一个 系列 'Value'。我做了以下。

every2 = []
counter = 2
temp = []
for point in My_list:
    if counter > 0:
        temp.append(point["Value"])
    else:
        p = point
        p["Value"] = sum(temp)/len(temp)
        every2.append(point)
        # reset the counter after every 2 point
        counter = 2
        temp = []
        # temp.append(point["Value"])
    counter -= 1

print(every2)

我得到的结果是:

[{'Point': 3, 'Value': 40.0}, {'Point': 5, 'Value': 40.0}, {'Point': 7, 'Value': 40.0}, {'Point': 9, 'Value': 40.0},  
 {'Point': 1, 'Value': 250.0}, {'Point': 3, 'Value': 40.0}, {'Point': 5, 'Value': 40.0}, {'Point': 7, 'Value': 40.0},  
 {'Point': 9, 'Value': 40.0}, {'Point': 1, 'Value': 250.0}, {'Point': 3, 'Value': 40.0}, {'Point': 5, 'Value': 40.0},  
{'Point': 7, 'Value': 40.0}, {'Point': 9, 'Value': 40.0}]

但是我错过了第一个 'Point',因为第一个系列的 'Point' 从 3 而不是 1 开始,因此 'Point' 9 的值为 40而不是 125.

所以我想要的应该是这样的:

[{'Point': 1, 'Value': 40.0}, {'Point': 3, 'Value': 40.0}, {'Point': 5, 'Value': 40.0}, {'Point': 7, 'Value': 40.0},   
 {'Point': 9, 'Value': 125.0}, {'Point': 1, 'Value': 40.0}, {'Point': 3, 'Value': 40.0}, {'Point': 5, 'Value': 40.0},  
 {'Point': 7, 'Value': 40.0}, {'Point': 9, 'Value': 125.0}, {'Point': 1, 'Value': 40.0}, {'Point': 3, 'Value': 40.0},  
{'Point': 5, 'Value': 40.0}, {'Point': 7, 'Value': 40.0}, {'Point': 9, 'Value': 125.0}]

您可以向 range() 添加一个 step 参数,这将允许您按步骤 2 遍历列表。然后,获取您要使用的两个元素,使用创建一个新元素值,并将其附加到结果列表中。

result_list = []

n_step = 2           # chunk size is 2

for i in range(0, len(My_list), n_step):
    # Get all elements in this chunk
    elems = My_list[i:i+n_step] 

    # Find the average of the Value key in elems
    avg = sum(item['Value'] for item in elems) / len(elems) 

    # Point key from the first element; Value key from average
    new_item = {"Point": elems[0]["Point"], "Value": avg}
    result_list.append(new_item)

给出:

[{'Point': 1, 'Value': 40.0},
 {'Point': 3, 'Value': 40.0},
 {'Point': 5, 'Value': 40.0},
 {'Point': 7, 'Value': 40.0},
 {'Point': 9, 'Value': 125.0},
 {'Point': 1, 'Value': 40.0},
 {'Point': 3, 'Value': 40.0},
 {'Point': 5, 'Value': 40.0},
 {'Point': 7, 'Value': 40.0},
 {'Point': 9, 'Value': 125.0},
 {'Point': 1, 'Value': 40.0},
 {'Point': 3, 'Value': 40.0},
 {'Point': 5, 'Value': 40.0},
 {'Point': 7, 'Value': 40.0},
 {'Point': 9, 'Value': 125.0}]

您也可以使用列表理解

res = [{**data[n], **{'Value': sum(v['Value']/2 for v in data[n: n+2])}} for n in range(0, len(data), 2)]
print(res)

输出:

[{'Point': 1, 'Value': 40.0},
 {'Point': 3, 'Value': 40.0},
 {'Point': 5, 'Value': 40.0},
 {'Point': 7, 'Value': 40.0},
 {'Point': 9, 'Value': 125.0},
 {'Point': 1, 'Value': 40.0},
 {'Point': 3, 'Value': 40.0},
 {'Point': 5, 'Value': 40.0},
 {'Point': 7, 'Value': 40.0},
 {'Point': 9, 'Value': 125.0},
 {'Point': 1, 'Value': 40.0},
 {'Point': 3, 'Value': 40.0},
 {'Point': 5, 'Value': 40.0},
 {'Point': 7, 'Value': 40.0},
 {'Point': 9, 'Value': 125.0}]

对于python 3.9+

[data[n] | {'Value': sum(v['Value']/2 for v in data[n: n+2])} for n in range(0, len(data), 2)]

这是另一个选项,它使用 zipMy_list 上“并行循环”并带有偏移量:

result = [
    {"Point": p1["Point"], "Value": (p1["Value"] + p2["Value"]) / 2}
    for p1, p2 in zip(My_list[::2], My_list[1::2])
]

要求所有系列的长度都是偶数。