如何基于两两比较的重复判断函数对Python对象列表进行分组
解法1:通用双参数比较函数分组(适配任意is_duplicate逻辑)
思路是逐个遍历机构,维护已完成的分组列表,对每个新机构,检查是否和已有分组中的任意元素满足is_duplicate条件,是则加入对应分组,否则新建分组。
def group_by_duplicate_func(org_list, duplicate_checker): groups = [] for org in org_list: matched = False for group in groups: # 只要和分组内任意一个元素判定为重复,就加入该分组 if duplicate_checker(org, group[0]): group.append(org) matched = True break if not matched: groups.append([org]) # 转换为你要求的元组格式 return [tuple(g) for g in groups] # 调用测试 grouped_by_duplicates = group_by_duplicate_func(orgs, is_duplicate)
这个方法完全兼容任意双入参的重复判定逻辑,不用修改判定函数本身。
解法2:利用同源无重复特性优化
因为你提到同一fetched_from下没有重复数据,若你的is_duplicate本质是判断某些字段相等,还可以进一步提取分组键,用字典实现O(n)时间复杂度的分组:
from collections import defaultdict def group_by_key(org_list): group_dict = defaultdict(list) for org in org_list: # 这里的键对应你is_duplicate的判定逻辑,判定逻辑修改只需调整键的生成规则 group_key = org.name group_dict[group_key].append(org) return [tuple(v) for v in group_dict.values()] grouped_by_duplicates = group_by_key(orgs)
合并重复数据演示
拿到分组后直接用你提供的merge函数配合reduce使用即可:
from functools import reduce merged_orgs = [reduce(merge, group) for group in grouped_by_duplicates]
内容的提问来源于stack exchange,提问作者barciewicz
相关产品推荐
相关产品推荐

