Python如何删除列表中元素相同但顺序不同的重复子列表
Python 嵌套列表无序子列表去重实现
需求说明
现有嵌套列表结构,子列表元素内容完全一致但排列顺序不同的项视为重复项,需要删除重复项仅保留一份。示例原始数据如下:
data = [['USD','PEN'], ['GFY' ,'ARG'], ['TFG','RSD'], ['PEN','USD'], ['GFT','RSD']]
上述示例中['PEN','USD']与先出现的['USD','PEN']元素完全相同仅顺序不同,属于需要移除的重复项。
实现思路
核心是为每个子列表生成和元素顺序无关、可哈希的唯一标识,遍历原列表时通过集合记录已经出现过的标识,标识未出现过的子列表保留,已存在的直接跳过。
通用实现代码(兼容子列表含重复元素场景)
将每个子列表排序后转为元组作为唯一标识,该方案不受子列表内元素顺序影响,也能正确区分子列表内存在重复元素的情况:
seen = set() res = [] for sub in data: # 排序转元组消除顺序影响,元组可哈希存入集合做判重 uniq_key = tuple(sorted(sub)) if uniq_key not in seen: seen.add(uniq_key) res.append(sub)
运行后res的输出为:
[['USD', 'PEN'], ['GFY', 'ARG'], ['TFG', 'RSD'], ['GFT', 'RSD']]
符合去重预期。
特定场景优化方案
如果子列表内不存在重复元素、且所有元素都可哈希(比如示例中都是无重复的字符串标识),可以用frozenset(sub)作为判重key,相比排序的方案性能更好:
seen = set() res = [] for sub in data: uniq_key = frozenset(sub) if uniq_key not in seen: seen.add(uniq_key) res.append(sub)
注意:该方案无法区分子列表内元素重复的情况,比如
['A','A','B']和['A','B']生成的frozenset完全一致,会被误判为重复项,仅适合子列表元素无重复的场景。
补充说明
如果需要保留重复项中最后一次出现的子列表版本,只需要倒序遍历原列表,收集完结果后再反转即可,判重逻辑和上述方案一致。
内容的提问来源于stack exchange,提问作者Dreku
相关产品推荐
相关产品推荐

