如何获取集合组中每个集合的独有元素?含Pandas/Numpy实现疑问
找出各集合的独有元素及Pandas/Numpy实现方式
原生集合操作实现
要找出每个集合的独有元素,核心思路是用当前集合减去其他所有集合的并集——其他集合的并集包含了所有在其他集合中出现过的元素,减去后剩下的就是只在当前集合存在的元素。
基础实现代码
sets = { 'rat': {'a', 'b', 'c', 'd'}, 'cat': {'a', 'b', 'd', 'f'}, 'dog': {'a', 'b'}, } uniq = {} all_groups = list(sets.keys()) for group in all_groups: # 合并当前组之外的所有集合 others_union = set() for other_group in all_groups: if other_group != group: others_union.update(sets[other_group]) # 计算当前组的独有元素 uniq[group] = sets[group] - others_union print(uniq) # 输出: {'rat': {'c'}, 'cat': {'f'}, 'dog': set()}
简洁写法
用生成器表达式和集合的union方法简化代码:
uniq = { group: sets[group] - set().union(*(sets[g] for g in sets if g != group)) for group in sets }
Pandas实现方式
如果用Pandas处理,可以通过构建元素-集合的关联表,统计元素出现的集合数量,再筛选出只出现一次的元素并映射回对应集合。
方法一:布尔矩阵统计
import pandas as pd sets = { 'rat': {'a', 'b', 'c', 'd'}, 'cat': {'a', 'b', 'd', 'f'}, 'dog': {'a', 'b'}, } # 收集所有唯一元素 all_elements = set().union(*sets.values()) # 创建布尔矩阵:行=元素,列=集合,值表示元素是否在集合中 df = pd.DataFrame(index=all_elements) for col in sets: df[col] = df.index.isin(sets[col]) # 统计每个元素被多少个集合包含 df['appear_count'] = df.sum(axis=1) # 筛选只在一个集合中出现的元素 unique_elems = df[df['appear_count'] == 1] # 构建结果字典 uniq_pd = {col: set(unique_elems[unique_elems[col]].index) for col in sets} print(uniq_pd) # 输出: {'rat': {'c'}, 'cat': {'f'}, 'dog': set()}
方法二:长表分组统计
import pandas as pd # 将集合转换为元素-集合的配对列表 data = [] for group, elements in sets.items(): data.extend([(elem, group) for elem in elements]) df = pd.DataFrame(data, columns=['element', 'group']) # 统计每个元素所属的集合数量 elem_group_count = df.groupby('element')['group'].nunique() # 筛选只属于一个集合的元素 target_elems = elem_group_count[elem_group_count == 1].index # 按集合分组收集独有元素 uniq_pd = df[df['element'].isin(target_elems)].groupby('group')['element'].apply(set).to_dict() # 为没有独有元素的集合补充空集合 for group in sets: uniq_pd.setdefault(group, set()) print(uniq_pd)
内容的提问来源于stack exchange,提问作者catleeball
相关产品推荐
相关产品推荐

