如何用Python查找不同长度嵌套列表的重复项并分组生成新列表
Python合并存在公共元素的嵌套列表实现
实现思路
你需要的是把所有存在共享元素的子列表做并集合并,这是并查集(Union-Find)算法的典型适用场景,也可以用遍历合并的写法处理中小规模的数据集,适配性更强。
完整代码实现
def merge_overlapping_lists(input_lists): merged = [] for sublist in input_lists: sub_set = set(sublist) # 收集所有和当前子列表存在交集的已合并集合索引 overlap_indices = [] for i, existing in enumerate(merged): if sub_set & existing: overlap_indices.append(i) if overlap_indices: # 合并所有重叠集合与当前集合 new_set = sub_set.union(*[merged[i] for i in overlap_indices]) # 倒序删除旧的重叠集合,避免索引错乱 for i in reversed(overlap_indices): del merged[i] merged.append(new_set) else: # 无交集直接新增 merged.append(sub_set) # 集合转排序后的列表,匹配预期输出格式 return [sorted(list(s)) for s in merged] # 输入的原始嵌套列表 input_data = [ [1, 2], [3], [4], [5, 6], [7], [8], [9], [10], [11, 14], [12, 13], [15], [16], [17], [18], [19], [20], [21, 61], [22], [23], [24], [25], [26, 45], [27], [28], [29], [30], [31], [32], [33], [34], [35, 36], [37], [38], [39], [40, 41], [42, 48], [43], [44], [46], [47], [49], [50], [51], [52], [53], [54, 62], [55, 56], [57], [58, 59], [60, 61], [63, 62], [64], [65], [66, 67], [68], [69] ] # 调用函数获得结果 output = merge_overlapping_lists(input_data) print(output)
结果验证
运行代码后输出的结果和你要求的完全一致,包含合并后的[54, 62, 63]子列表,其余无公共元素的子列表保持原有内容不变。该实现同时支持多组重叠的场景,比如三个及以上子列表存在关联公共元素的情况也可以正确合并。
性能提示
如果你的数据量超过万条子列表,可以替换为并查集实现进一步降低时间复杂度,上述实现对于普通规模的数据集已经足够高效易用。
内容的提问来源于stack exchange,提问作者sotokan80
相关产品推荐
相关产品推荐

