发布于2026-07-18 阅读(0)
扫一扫,手机访问
本文介绍如何准确统计字典中所有值列表(如 ['x', 'y'])的标准化组合(排序后去重)及其出现次数,并按频次降序输出形如 n=5: ('x', 'y') 的结果,避免因字典键重复导致的覆盖问题。
在数据处理中,常会遇到这样的需求:统计字典中每个值列表的唯一组合及其出现频次。比如,给定字典 {'HH1': ['x'], 'HH2': ['y', 'x'], ...},目标是得到每个标准化组合(如 ('x', 'y'))出现的次数,并按频次降序输出。下面就来详细拆解正确做法。

核心目标直截了当:将每个值列表标准化为有序元组(例如 ['y', 'x'] → ('x', 'y')),然后统计每种标准化组合在整个字典中间出现的精确次数。但实际操作中,不少人容易掉进这几个坑里:
combinations(..., r))进行计数,导致统计的是“子集出现频次”,而非“原始列表匹配频次”;n=count 作为字典键,结果多个不同组合若具有相同频次(比如两个组合都出现 1 次),后写入的会覆盖先写入的;['x','y'] 和 ['y','x'] 被视为不同键,无法合并。✅ 正确解法的关键在于:以标准化元组为字典键,频次为值。下面是推荐实现,简洁、高效且语义清晰:
from collections import defaultdict
HH_dict = {
'HH1': ['x'], 'HH2': ['y', 'x'], 'HH3': ['x', 'z'], 'HH4': ['x'], 'HH5': ['x'],
'HH6': ['x'], 'HH7': ['x'], 'HH8': ['x', 'y', 'z'], 'HH9': ['x'], 'HH10': ['x', 'y'],
'HH11': ['x'], 'HH12': ['x'], 'HH13': ['x'], 'HH14': ['x'], 'HH15': ['x', 'y'],
'HH16': ['x', 'y'], 'HH17': ['x', 'y'], 'HH18': ['x']
}
# 步骤1:统计每种标准化组合(排序后转tuple)的出现次数
combination_count = defaultdict(int)
for lst in HH_dict.values():
# 标准化:去重 + 排序 + 转元组(确保 ['y','x'] 和 ['x','y'] 视为同一组合)
key = tuple(sorted(set(lst)))
combination_count[key] += 1
# 步骤2:按频次降序输出(频次相同时可选按元组字典序升序,增强可读性)
for combo, count in sorted(combination_count.items(), key=lambda x: (-x[1], x[0])):
print(f"n={count}: {combo}")
输出结果:
n=11: ('x',)
n=5: ('x', 'y')
n=1: ('x', 'z')
n=1: ('x', 'y', 'z')
? 关键说明:
set(lst) 消除列表内重复元素(本例虽无重复,但属于健壮性保障);sorted(...) 确保顺序一致,使等价组合映射到同一键;defaultdict(int) 或原生 dict 手动判断均可,避免 Counter 在此处的误用;sorted(..., key=lambda x: (-x[1], x[0])) 实现主序按频次降序、次序按组合升序,输出稳定且易读。⚠️ 注意事项:
n=count 作为输出字典的键(如 renamed_lists[f"n={count}"]),这会丢失信息;combinations(..., r)——本题要求的是完整列表的匹配,而非其幂集;[],需单独处理(tuple(sorted(set([]))) 得 ()),根据业务决定是否纳入统计。该方法时间复杂度为 O(N×M log M),其中 N 为字典长度,M 为单个列表平均长度,兼顾效率与可维护性,适用于中等规模数据场景。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8