Python字典中多元素项集在交易列表中的出现次数统计
多元素项集出现次数统计的通用实现方法
问题背景
现有交易字典:
transactions = { "T1": ["A", "B", "C", "E"], "T2": ["A", "D", "E"], "T3": ["B", "C", "E"], "T4": ["B", "C", "D", "E"], "T5": ["B", "D", "E"] }
待统计的多元素项集列表:
items = [('B', 'C'), ('B', 'D'), ('B', 'E'), ('C', 'D'), ('C', 'E'), ('D', 'E')]
预期统计结果:
{('B','C'): 3, ('B', 'D'): 2, ('B', 'E'): 4, ('C', 'D'): 1, ('C', 'E'): 3, ('D', 'E'): 3}
现有函数仅支持单元素项集统计:
def get_num_occurrences(items, transactions): occurr = dict() for x in items: occurr[x] = 0 for transaction in transactions.values(): for item in transaction: occurr[item] += 1 return occurr
需要修改该函数,使其支持二元、三元等任意长度的多元素项集统计。
通用实现方案
修改后的函数如下:
def get_num_occurrences(items, transactions): occurr = {item: 0 for item in items} # 将每个交易转换为集合,方便快速判断子集关系 transaction_sets = [set(tx) for tx in transactions.values()] for item_set in items: for tx_set in transaction_sets: # 判断当前项集是否是该交易的子集 if set(item_set).issubset(tx_set): occurr[item_set] += 1 return occurr
逻辑说明
- 初始化计数字典:用字典推导式直接初始化所有待统计项集的计数为0,比循环赋值更简洁高效。
- 交易转集合:把每个交易列表转换成集合,利用集合的
issubset方法可以快速判断一个项集是否完全包含在该交易中,这是适配多元素项集的核心逻辑。 - 遍历统计:对每个待统计的项集,遍历所有交易集合,若项集是交易集合的子集,就给对应计数加1。这种方式不限制项集的长度,不管是1元、2元还是N元项集,都能正确统计出现次数。
内容的提问来源于stack exchange,提问作者LeGOATJames23
相关产品推荐
相关产品推荐

