二维列表去重求助:提取元素集合唯一的行(含代码问题)
二维列表按元素集合去重的解决方案
问题说明
需要从二维列表中提取元素集合唯一的行:无论行内元素顺序如何,只要元素的集合(或多重集合)相同即视为重复行,需去重保留其中一行。
原列表
lp = [['16', 'jun', 'jun', '18'], ['jun', '16', 'jun', '18'], ['aug', '16', 'jun', '18'], ['aug', '16', 'jun', '18'], ['sep', '17', 'mar', '18']]
期望输出
desired_list = [['16', 'jun', 'jun', '18'], ['aug', '16', 'jun', '18'], ['sep', '17', 'mar', '18']]
现有代码问题
你当前的嵌套循环逻辑存在缺陷:
- 仅遍历比较
i和j行,会漏掉原列表的第一行元素 - 判断条件混乱,仅将与
i行集合不同的j行加入结果,无法正确记录已出现的所有集合
解决方案
方法1:基于集合去重(不考虑元素重复次数)
如果仅需判断去重后的元素集合是否相同(即只要元素种类一致,不管出现几次都视为重复),可以用frozenset(可哈希,能存入集合)记录已出现的集合:
lp = [['16', 'jun', 'jun', '18'], ['jun', '16', 'jun', '18'], ['aug', '16', 'jun', '18'], ['aug', '16', 'jun', '18'], ['sep', '17', 'mar', '18']] seen = set() result = [] for row in lp: # 将行转成不可变的frozenset,用于判断是否已出现 row_set = frozenset(row) if row_set not in seen: seen.add(row_set) result.append(row) print(result)
方法2:基于排序后元组去重(考虑元素重复次数)
如果需要严格判断元素的多重集合是否相同(即元素种类和出现次数都一致,仅顺序不同视为重复),可以用sorted将行排序后转成tuple(可哈希)作为判断依据:
lp = [['16', 'jun', 'jun', '18'], ['jun', '16', 'jun', '18'], ['aug', '16', 'jun', '18'], ['aug', '16', 'jun', '18'], ['sep', '17', 'mar', '18']] seen = set() result = [] for row in lp: # 排序后转成元组,确保顺序不同但元素组成(含次数)相同的行被视为重复 key = tuple(sorted(row)) if key not in seen: seen.add(key) result.append(row) print(result)
两种方法都能得到你期望的输出,可根据实际需求选择。
内容的提问来源于stack exchange,提问作者Shubham Trivedi
相关产品推荐
相关产品推荐

