如何从二维列表的各行中提取重复元素与非重复元素
提取二维列表中含重复行的重复元素与非重复元素
给定一个二维列表,部分行存在重复值,需要从这些有重复值的行中分别提取出重复元素(去重后的重复项)和非重复元素(仅出现一次的元素),示例如下:
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
相关产品推荐
相关产品推荐

