如何去除嵌套列表中前两元素重复或逆序重复的子列表
嵌套列表去重问题
我有一个嵌套列表:
original_list = [[1, 2, '0.68', 1.24], [1, 2, '0.43', 2.39], [3, 0, '0.91', 3.61], [0, 3, '0.08', 3.95], [3, 0, '0.08', 5.17]]
需求
需要删除满足以下任一条件的子列表,仅保留每组中的第一个元素:
- 子列表前两个元素完全相同(例如
[1, 2, '0.68', 1.24]和[1, 2, '0.43', 2.39],保留其一) - 子列表前两个元素顺序相反(例如
[3, 0, '0.91', 3.61]和[0, 3, '0.08', 3.95],保留其一)
期望输出
[[1, 2, '0.68', 1.24], [3, 0, '0.91', 3.61]]
尝试的代码及问题
我写了如下代码,但无法得到正确结果:
def delete_Duplicate(liste): for li in liste: for li2 in liste: if (li[0] == li2[0] and li[1] == li2[1] ) or (li[1] == li2[0] and li[0] == li2[1] ): liste.pop(liste.index(li2)) return liste
这段代码存在两个核心问题:
- 遍历中修改原列表:直接对正在遍历的列表执行
pop操作,会打乱遍历的索引顺序,导致部分元素被跳过或重复处理。 - 误删自身:当
li和li2指向同一个子列表时,条件也会成立,导致误删当前遍历的元素。
正确解法
通过维护一个存储已处理特征的集合,用子列表前两个元素的排序元组作为特征(这样(1,2)和(2,1)会被视为同一个特征,(3,0)和(0,3)同理),遍历列表时仅保留每个特征对应的第一个子列表。
代码实现:
def delete_Duplicate(liste): seen_features = set() filtered_list = [] for sublist in liste: # 生成排序后的特征元组,统一标识相同/相反的前两个元素 feature = tuple(sorted(sublist[:2])) if feature not in seen_features: seen_features.add(feature) filtered_list.append(sublist) return filtered_list # 测试执行 original_list = [[1, 2, '0.68', 1.24], [1, 2, '0.43', 2.39], [3, 0, '0.91', 3.61], [0, 3, '0.08', 3.95], [3, 0, '0.08', 5.17]] print(delete_Duplicate(original_list))
执行后输出:
[[1, 2, '0.68', 1.24], [3, 0, '0.91', 3.61]]
内容的提问来源于stack exchange,提问作者Anas
相关产品推荐
相关产品推荐

