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

二维列表去重求助:提取元素集合唯一的行(含代码问题)

二维列表按元素集合去重的解决方案

问题说明

需要从二维列表中提取元素集合唯一的行:无论行内元素顺序如何,只要元素的集合(或多重集合)相同即视为重复行,需去重保留其中一行。

原列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:21:11