如何访问并比较列表中多个字典的键?并生成包含对应值平均值的字典
计算多字典列表中各键值的平均值
嘿,这个需求我之前也碰到过,给你分享几个实用的实现思路,既能解决多字典键的访问问题,又能高效算出平均值~
首先先明确一个前提:你的案例里所有字典的键都是一致的,我先基于这个情况讲几个方法,最后再补充键不一致时的鲁棒性方案。
方法一:直观遍历法(适合新手理解)
先取出第一个字典的所有键,然后对每个键,遍历所有字典收集对应的值,最后计算平均值:
data = [ {'clicks': 1.2195121951219512, 'conversions': 1.4227642276422763, 'cpc': 2.2357723577235773, 'cpm': 4.471544715447155, 'reach': 90.65040650406505}, {'clicks': 1.2048192771084338, 'conversions': 1.4056224899598393, 'cpc': 2.208835341365462, 'cpm': 5.622489959839357, 'reach': 89.5582329317269} ] # 获取所有键(因为所有字典键一致,取第一个即可) keys = data[0].keys() average_dict = {} for key in keys: # 收集每个键对应的所有值 values = [d[key] for d in data] # 计算平均值并存入结果字典 average_dict[key] = sum(values) / len(values) print(average_dict)
这个方法逻辑直白,每一步都很清晰,新手也能快速看懂。
方法二:字典推导式(Pythonic极简写法)
把上面的循环改成字典推导式,一行就能搞定,代码更简洁:
average_dict = { key: sum(d[key] for d in data) / len(data) for key in data[0].keys() }
这种写法是Python里的惯用技巧,既简洁又高效,适合键完全一致的场景。
方法三:处理键不一致的鲁棒方案
如果你的字典列表里,有的字典可能缺少某些键,可以先用集合收集所有唯一的键,再逐个处理:
all_keys = set().union(*data) # 收集所有字典的键,去重 average_dict = {} for key in all_keys: # 只收集存在该键的字典的值 values = [d[key] for d in data if key in d] if values: # 避免空列表除以0的错误 average_dict[key] = sum(values) / len(values) else: average_dict[key] = 0 # 或者根据你的需求设为None等 print(average_dict)
这个方法能应对更复杂的情况,不会因为个别字典缺少键而报错。
方法四:用defaultdict统一收集值
借助collections.defaultdict来先把所有键对应的值都收集到列表里,再统一计算平均值,逻辑也很清晰:
from collections import defaultdict value_collector = defaultdict(list) # 遍历所有字典,把每个键的值追加到对应的列表里 for d in data: for key, val in d.items(): value_collector[key].append(val) # 计算每个键的平均值 average_dict = {key: sum(vals)/len(vals) for key, vals in value_collector.items()}
这种方式也能自动处理键不一致的情况,而且代码可读性不错。
方法五:大数据量用pandas高效处理
如果你的字典列表数据量很大,或者平时习惯用pandas的话,这个方法最省心:
import pandas as pd # 把列表转成DataFrame,然后直接计算均值,再转成字典 df = pd.DataFrame(data) average_dict = df.mean().to_dict() print(average_dict)
pandas会自动帮你处理所有键的均值计算,效率极高,代码也极简。
内容的提问来源于stack exchange,提问作者Shubham Sangle
相关产品推荐
相关产品推荐

