如何基于另一列表分组移除列表中的重复元素
实现思路与代码
核心规则
按列表a中连续相同元素分组,对每组对应的b元素做如下处理:
- 仅保留第一次出现的非空值(如
v1/v2/v3等),后续重复的相同非空值替换为空字符串'' - 原有的空字符串保持不变
可行方案:分组后逐组处理
你提到的「先将b按a的分组转为二维列表再处理」完全可行,具体步骤如下:
- 分组:利用
itertools.groupby(因a中相同元素连续),将a和b配对后按a的元素分组,提取每组对应的b元素子集。 - 去重处理:对每个
b子集,维护一个记录已出现非空值的集合,遍历元素时:- 空字符串直接保留
- 首次出现的非空值保留并加入集合
- 重复出现的非空值替换为空字符串
- 合并结果:将处理后的所有分组元素合并为最终的
b列表。
代码实现
import itertools a = [1,1,1,1,2,2,2,2,3,3,3,3,3,3,4,4,5,5,5,5,5] b = ['v1','v2','v2','', 'v1','v2','v2','', 'v1','v2','v3','v3','v3','v3', 'v1','v2', 'v1','v2','v2','v2',''] processed_b = [] # 按a的元素分组,同时配对对应的b元素 for key, group in itertools.groupby(zip(a, b), key=lambda x: x[0]): b_group = [item[1] for item in group] seen = set() temp = [] for elem in b_group: if elem == '': temp.append('') else: if elem not in seen: temp.append(elem) seen.add(elem) else: temp.append('') processed_b.extend(temp) # 输出预期结果 print(processed_b)
输出结果
['v1', 'v2', '', '', 'v1', 'v2', '', '', 'v1', 'v2', 'v3', '', '', '', 'v1', 'v2', 'v1', 'v2', '', '', '']
内容的提问来源于stack exchange,提问作者bilal saeed
相关产品推荐
相关产品推荐

