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

Python实现嵌套列表中无序name组合去重的更Pythonic方法

问题分析与更Pythonic的实现方案

你的原始代码存在几个明显问题:

  • 索引越界:子列表仅包含4个元素(索引0~3),原代码中调用i[3]、i[4]会直接抛出索引错误
  • 去重逻辑错误:unique.add(i[-1]) 实际添加的是子列表的最后一个值val2,不是name的组合键,无法实现预期的去重效果
  • 无意义修改原数据:你的预期输出是保留首次出现的原条目,不需要交换val1和val2的位置

最优实现方案

核心思路是用排序后的name元组作为顺序无关的唯一键,遍历过程中仅保留首次出现的条目,代码简洁易读,完全符合Pythonic风格:

def remove_dupes(lst):
    seen = set()
    result = []
    for item in lst:
        # 生成和name顺序无关的唯一键
        key = tuple(sorted((item[0], item[1])))
        if key not in seen:
            seen.add(key)
            result.append(item)
    return result

测试效果

输入你提供的测试用例:

test_lst = [['a','b',4,5],
['x','y',2,10],
['b','a',5,4],
['d','y',8,10],
['y','d',10,8],
['a','d',4,8]]
print(remove_dupes(test_lst))

输出和你预期的结果完全一致:

[['a', 'b', 4, 5], ['x', 'y', 2, 10], ['d', 'y', 8, 10], ['a', 'd', 4, 8]]

可选扩展版本

如果你需要不仅去重,还要统一把所有条目的name按字典序排列、对应val也跟随调整,可以用下面的版本:

def remove_dupes_with_unify_order(lst):
    seen = set()
    result = []
    for name1, name2, val1, val2 in lst:
        key = tuple(sorted((name1, name2)))
        if key not in seen:
            seen.add(key)
            # 统一name顺序的同时调整对应val的位置
            result.append([name2, name1, val2, val1] if name1 > name2 else [name1, name2, val1, val2])
    return result

内容的提问来源于stack exchange,提问作者jbogart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:15:03