条件成立时对字典列表的值求和
Sum the values of a list of dictionaries when condition holds
我想在下面的字典列表中对属于相同 'TimePoint' 的 'Output' 值求和。在这个例子中,我只有 2 个时间序列,但我想要一个适用于 2 个以上的解决方案。
List = [
{'TimePoint': 1, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 50},
{'TimePoint': 61, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 70},
{'TimePoint': 121, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 90},
{'TimePoint': 181, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 80},
{'TimePoint': 241, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 50},
{'TimePoint': 301, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 50},
{'TimePoint': 361, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 40},
... ... ... ... ...
{'TimePoint': 1321, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 20},
{'TimePoint': 1381, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 10},
{'TimePoint': 1, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 100},
{'TimePoint': 61, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 90},
{'TimePoint': 121, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 50},
{'TimePoint': 181, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 30},
{'TimePoint': 241, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 30},
{'TimePoint': 301, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 60},
{'TimePoint': 361, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 10},
... ... ... ... ... ...
{'TimePoint': 1321, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 70},
{'TimePoint': 1381, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 20}]
我期望的结果应该是这样的:
New_list = [
{'TimePoint': 1, 'Output': 150},
{'TimePoint': 61, 'Output': 160},
{'TimePoint': 121,'Output': 140},
{'TimePoint': 181, 'Output': 110},
{'TimePoint': 241, 'Output': 80},
{'TimePoint': 301, 'Output': 110},
{'TimePoint': 361, 'Output': 50},
... ...
{'TimePoint': 1321, 'Output': 90},
{'TimePoint': 1381, 'Output': 30}]
我在下面尝试的方法似乎没有用,因为 'Output' 值没有汇总。
New_list = []
for key, group in itertools.groupby(List, lambda item: item['TimePoint']):
new_dict = {}
new_dict['TimePoint'] = key
new_dict['Output'] = sum([item['Output'] for item in group])
new_list.append(new_dict)
首先List
是Python中的保留名称,因此不要将其用于变量名。其次,解决方案是否必须是字典列表?它不是最容易使用的。
为了便于阅读,我将使用两个循环:
timepoint_dict = {}
for item in List:
timepoint = str(item["TimePoint"])
if timepoint in timepoint_dict:
timepoint_dict[timepoint] += item["Output"]
else:
timepoint_dict[timepoint] = item["Output"]
result_list = []
for key, value in timepoint_dict.items():
result_list.append({"TimePoint": int(key), "Output": value})
从性能的角度来看,我建议不要在一个循环中这样做,因为搜索 TimePoint
字段,例如在 list-object 中有 O^n-Complexity.
我想在下面的字典列表中对属于相同 'TimePoint' 的 'Output' 值求和。在这个例子中,我只有 2 个时间序列,但我想要一个适用于 2 个以上的解决方案。
List = [
{'TimePoint': 1, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 50},
{'TimePoint': 61, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 70},
{'TimePoint': 121, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 90},
{'TimePoint': 181, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 80},
{'TimePoint': 241, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 50},
{'TimePoint': 301, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 50},
{'TimePoint': 361, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 40},
... ... ... ... ...
{'TimePoint': 1321, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 20},
{'TimePoint': 1381, 'AreaIn': 'Area A', 'AreaOut': 'Area B', 'Line': 'Line_A_B', 'Output': 10},
{'TimePoint': 1, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 100},
{'TimePoint': 61, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 90},
{'TimePoint': 121, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 50},
{'TimePoint': 181, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 30},
{'TimePoint': 241, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 30},
{'TimePoint': 301, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 60},
{'TimePoint': 361, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 10},
... ... ... ... ... ...
{'TimePoint': 1321, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 70},
{'TimePoint': 1381, 'AreaIn': 'Area C', 'AreaOut': 'Area D', 'Line': 'Line_C_D', 'Output': 20}]
我期望的结果应该是这样的:
New_list = [
{'TimePoint': 1, 'Output': 150},
{'TimePoint': 61, 'Output': 160},
{'TimePoint': 121,'Output': 140},
{'TimePoint': 181, 'Output': 110},
{'TimePoint': 241, 'Output': 80},
{'TimePoint': 301, 'Output': 110},
{'TimePoint': 361, 'Output': 50},
... ...
{'TimePoint': 1321, 'Output': 90},
{'TimePoint': 1381, 'Output': 30}]
我在下面尝试的方法似乎没有用,因为 'Output' 值没有汇总。
New_list = []
for key, group in itertools.groupby(List, lambda item: item['TimePoint']):
new_dict = {}
new_dict['TimePoint'] = key
new_dict['Output'] = sum([item['Output'] for item in group])
new_list.append(new_dict)
首先List
是Python中的保留名称,因此不要将其用于变量名。其次,解决方案是否必须是字典列表?它不是最容易使用的。
为了便于阅读,我将使用两个循环:
timepoint_dict = {}
for item in List:
timepoint = str(item["TimePoint"])
if timepoint in timepoint_dict:
timepoint_dict[timepoint] += item["Output"]
else:
timepoint_dict[timepoint] = item["Output"]
result_list = []
for key, value in timepoint_dict.items():
result_list.append({"TimePoint": int(key), "Output": value})
从性能的角度来看,我建议不要在一个循环中这样做,因为搜索 TimePoint
字段,例如在 list-object 中有 O^n-Complexity.