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
相关产品推荐
相关产品推荐

