Python中list_of_dicts_of_lists的列向众数/中位数求解
解决方法:按位置计算众数/中位数生成目标字典
首先得把需求掰明白:我们要处理这个包含多个字典的列表,对每个相同的键(比如'a'、'b'),把所有字典里该键对应子列表的同位置元素归成一组。对每组元素,先看有没有唯一的众数——有就用众数,要是多个元素出现次数一样多(没唯一众数),就用中位数。最后把每个键对应的两个位置结果拼成列表,得到目标字典。
实现步骤
- 先给数据分组:把每个键对应的所有子列表的第0位、第1位元素分别收集成独立列表。比如键
'a'的第0位元素集合是[1,2,2,1],第1位是[2,2,2,2]。 - 写个判断众数/中位数的工具函数:输入一个数值列表,先找出所有出现次数最多的元素;如果只有一个这样的元素,就返回它(众数),否则返回列表的中位数。
- 生成最终字典:遍历每个键,对两个位置的列表分别用上面的函数,把结果组合成列表塞进结果字典里。
完整代码实现
import statistics def get_mode_or_median(num_list): # 拿到所有出现次数最多的元素(支持多个众数的情况) modes = statistics.multimode(num_list) # 只有唯一众数就返回它,否则返回中位数 if len(modes) == 1: return modes[0] else: return statistics.median(num_list) # 你的输入数据 list_of_dicts_of_lists = [ {'a': [1,2], 'b': [3,4], 'c': [3,2], 'd': [2,5]}, {'a': [2,2], 'b': [2,2], 'c': [1,6], 'd': [4,7]}, {'a': [2,2], 'b': [5,2], 'c': [3,2], 'd': [2,2]}, {'a': [1,2], 'b': [3,4], 'c': [1,6], 'd': [5,5]} ] # 第一步:整理每个键对应的各位置元素 # 先获取所有键(默认所有字典的键都一致) keys = list(list_of_dicts_of_lists[0].keys()) # 初始化分组容器:每个键对应两个列表,分别存第0位、第1位元素 grouped_data = {key: [[], []] for key in keys} for d in list_of_dicts_of_lists: for key in keys: # 把当前字典中key对应子列表的两个元素分别加入分组 grouped_data[key][0].append(d[key][0]) grouped_data[key][1].append(d[key][1]) # 第二步:生成目标字典 median_dict_of_lists = {} for key in keys: # 对两个位置的列表分别计算结果 pos0_result = get_mode_or_median(grouped_data[key][0]) pos1_result = get_mode_or_median(grouped_data[key][1]) median_dict_of_lists[key] = [pos0_result, pos1_result] print(median_dict_of_lists) # 输出结果正好是你要的:{'a': [1.5, 2], 'b': [3, 3], 'c': [2, 4], 'd': [3, 5]}
代码细节解释
- 数据分组:遍历每个字典,把每个键的子列表元素按位置拆分存储,这样每个键就有两个独立的元素集合,方便后续计算。
- 工具函数:用
statistics.multimode能直接拿到所有众数(Python3.8+支持),避免了手动统计次数的麻烦;如果众数不唯一,就用中位数兜底。 - 结果生成:逐个处理每个键的两个位置集合,把计算结果拼成列表,最终得到符合要求的字典。
举个例子,键'a'的第0位元素是[1,2,2,1],1和2都出现2次(没有唯一众数),所以取中位数(1+2)/2=1.5;第1位元素全是2,众数唯一,直接用2,完美匹配期望结果。
内容的提问来源于stack exchange,提问作者litepresence
相关产品推荐
相关产品推荐

