You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:30:45