社区检测中如何移除嵌套列表中的重复项?
移除嵌套列表中的重复子列表方案
原代码问题分析
- 变量名大小写不一致:原列表是
lst_of_lts,但代码中使用Lst_of_lts(Python大小写敏感),这会导致操作的是未定义的变量,自然无法修改原列表。 itertools.groupby的局限性:groupby只能对连续的相同元素分组,若重复子列表元素顺序不同(比如[1,2]和[2,1]),排序后仍不会连续,无法被分组去重。- 冗余步骤:先
sort再groupby完全多余,后续的集合推导式已经可以完成去重,多此一举反而可能引入问题。
针对不同需求的解决方案
需求1:移除**完全相同(包括元素顺序)**的子列表
如果子列表元素顺序完全一致才算重复,用tuple转成可哈希类型后,通过集合或有序字典去重:
# 简单去重(不保留原顺序) unique_lists = list(map(list, {tuple(lst) for lst in lst_of_lts})) # 保留原列表顺序(Python 3.7+) unique_lists = list(map(list, dict.fromkeys(tuple(lst) for lst in lst_of_lts)))
需求2:移除**元素集合相同(忽略顺序)**的子列表
如果只要元素相同,不管顺序就算重复(比如社区检测中,同一组节点不管顺序都算同一个社区),先对子列表排序再转tuple去重:
# 简单去重(不保留原顺序) unique_lists = list(map(list, {tuple(sorted(lst)) for lst in lst_of_lts})) # 保留原列表顺序 seen = set() unique_lists = [] for lst in lst_of_lts: sorted_tuple = tuple(sorted(lst)) if sorted_tuple not in seen: seen.add(sorted_tuple) unique_lists.append(lst)
验证方法
可以打印去重前后的长度对比,确认是否生效:
print(f"原列表长度:{len(lst_of_lts)}") print(f"去重后列表长度:{len(unique_lists)}")
内容的提问来源于stack exchange,提问作者user532567
相关产品推荐
相关产品推荐

