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

如何从二维列表的各行中提取重复元素与非重复元素

提取二维列表中含重复行的重复元素与非重复元素

给定一个二维列表,部分行存在重复值,需要从这些有重复值的行中分别提取出重复元素(去重后的重复项)和非重复元素(仅出现一次的元素),示例如下:

df = [[1, 2, 4, 5, 6, 2, 6,7],   # 重复元素:2, 6
      [5, 6, 7, 22, 23, 34, 48], 
      [3, 5, 6, 7, 45, 46, 48],
      [6, 7, 14, 29, 32, 6, 29], # 重复元素:6,29
      [6, 7, 13, 23, 33, 35, 7], # 重复元素:7
      [1, 6, 7, 8, 9, 10, 8],    # 重复元素:8
      [0, 2, 5, 7, 19, 7, 5]]    # 重复元素:5,7

# 期望输出的重复元素列表(仅保留有重复的行的结果)
dup = [[2,6], [6,29], [7], [8], [5,7]]

# 期望输出的非重复元素列表(对应上述有重复的行)
non_dups = [[1,4,5,7], [7,14,32], [6,13,23,33,35], [1,6,7,9,10], [0,2,19]]

解决方案

利用collections.Counter统计每行元素的出现次数,再根据次数筛选目标元素:

from collections import Counter

df = [[1, 2, 4, 5, 6, 2, 6,7],
      [5, 6, 7, 22, 23, 34, 48],
      [3, 5, 6, 7, 45, 46, 48],
      [6, 7, 14, 29, 32, 6, 29],
      [6, 7, 13, 23, 33, 35, 7],
      [1, 6, 7, 8, 9, 10, 8],
      [0, 2, 5, 7, 19, 7, 5]]

dup = []
non_dups = []

for row in df:
    count = Counter(row)
    # 提取当前行的重复元素(出现次数>1)
    current_dup = [num for num, cnt in count.items() if cnt > 1]
    if current_dup:
        dup.append(current_dup)
        # 提取当前行的非重复元素,保留原行顺序并去重
        current_non_dup = []
        seen = set()
        for num in row:
            if count[num] == 1 and num not in seen:
                current_non_dup.append(num)
                seen.add(num)
        non_dups.append(current_non_dup)

print("dup:", dup)
print("non_dups:", non_dups)

输出结果

dup: [[2, 6], [6, 29], [7], [8], [5, 7]]
non_dups: [[1, 4, 5, 7], [7, 14, 32], [6, 13, 23, 33, 35], [1, 6, 7, 9, 10], [0, 2, 19]]

说明

  • Counter可以快速统计每行元素的出现频率,时间复杂度为O(n)(n为每行元素个数)
  • 重复元素直接筛选出现次数>1的键,自动完成去重
  • 非重复元素遍历原行筛选,用集合确保只保留一次,同时维持原行中的出现顺序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:26:34