如何从二维列表中筛选含多组重复元素的子列表并前置重复元素
问题:筛选并重组二维列表中满足重复条件的子列表
我有一个大型二维列表,部分子列表中存在重复元素。需要筛选出包含至少两组出现2次及以上的重复元素的子列表,对这些子列表将重复元素(每个只保留一个)放在前面,其余元素(去重后)放在后面。
示例输入
Df =[[2,3,5,20],[5,10,20,10],[4,13,15,15,17,34,17],[33,34,15,21],[12,16,24,32,12,33,24]]
期望输出
Df2 = [[15,17,4,13,34],[12,24,16,32,33]]
我的尝试(未满足需求)
这段代码只能筛选出存在重复元素的子列表,但无法识别“至少两组重复元素”的条件:
res = [t for t in Df if len(t) > len(set(t))]
解决方案
我们可以借助collections.Counter来统计元素出现次数,分三步完成需求:
- 统计每个子列表中元素的出现次数;
- 筛选出包含至少2个重复元素(出现≥2次)的子列表;
- 重组子列表:重复元素在前,非重复元素在后。
完整代码
from collections import Counter Df =[[2,3,5,20],[5,10,20,10],[4,13,15,15,17,34,17],[33,34,15,21],[12,16,24,32,12,33,24]] Df2 = [] for sublist in Df: # 统计子列表内各元素的出现次数 elem_count = Counter(sublist) # 提取所有出现2次及以上的元素(自动去重) duplicate_elems = [num for num, cnt in elem_count.items() if cnt >= 2] # 满足至少两组重复元素的条件才处理 if len(duplicate_elems) >= 2: # 提取非重复元素(去重且不属于重复元素集合) non_duplicate_elems = [num for num in set(sublist) if num not in duplicate_elems] # 重组并加入结果列表 Df2.append(duplicate_elems + non_duplicate_elems) print(Df2)
代码说明
Counter(sublist):快速统计子列表中每个元素的出现次数,返回键为元素、值为次数的字典;duplicate_elems:收集所有出现≥2次的元素,因为Counter的键本身是唯一的,所以无需额外去重;- 条件判断
len(duplicate_elems) >= 2:确保只处理符合要求的子列表; non_duplicate_elems:筛选出不属于重复元素的其他元素,用set(sublist)去重后避免重复;- 最后将重复元素列表和非重复元素列表拼接,得到符合要求的子列表。
运行代码后,输出结果与期望完全一致。
内容的提问来源于stack exchange,提问作者user12269799
相关产品推荐
相关产品推荐

