如何移除二维列表中子列表的重复元素且保留元素顺序
如何在保留元素顺序的前提下移除二维列表中子列表的重复元素?
给定一个包含多个子列表的二维列表,需要对每个子列表进行去重操作,同时严格保留子列表中唯一元素的原有出现顺序。示例如下:
输入:
list1 = [['a', 'a', 'b', 'b', 'b', 'v', 'v', 'v', 'v', 'x', 'x', 'p'], ['b', 'c', 'd', 'c'], ['a', 'j', 'j', 'j', 'c', 'c', 'f', 'f', 'h', 'h', 'h', 'h']]
期望输出:
Output = [['a', 'b', 'v', 'x', 'p'], ['b', 'c', 'd'], ['a', 'j', 'c', 'f', 'h']]
解决方案
方法一:循环+集合追踪(直观易读)
通过遍历每个子列表,用集合记录已出现的元素,筛选出未重复的元素并保留顺序:
list1 = [['a', 'a', 'b', 'b', 'b', 'v', 'v', 'v', 'v', 'x', 'x', 'p'], ['b', 'c', 'd', 'c'], ['a', 'j', 'j', 'j', 'c', 'c', 'f', 'f', 'h', 'h', 'h', 'h']] output = [] for sublist in list1: seen = set() unique_sublist = [] for item in sublist: if item not in seen: seen.add(item) unique_sublist.append(item) output.append(unique_sublist) print(output)
逻辑说明:
- 对每个子列表初始化空集合
seen和结果列表unique_sublist - 遍历子列表中的每个元素,若元素未在
seen中,则添加到unique_sublist并同步记录到seen - 这种方法时间复杂度为O(n)(n为所有子列表的元素总数),效率高,且代码逻辑清晰,适合处理20多行的二维列表。
方法二:列表推导式简化(简洁写法)
利用Python的短路特性,把上述逻辑压缩为更简洁的代码:
list1 = [['a', 'a', 'b', 'b', 'b', 'v', 'v', 'v', 'v', 'x', 'x', 'p'], ['b', 'c', 'd', 'c'], ['a', 'j', 'j', 'j', 'c', 'c', 'f', 'f', 'h', 'h', 'h', 'h']] output = [] for sublist in list1: seen = set() output.append([item for item in sublist if not (item in seen or seen.add(item))]) print(output)
逻辑说明:
or运算符会先判断item in seen,若为False则执行seen.add(item)(该方法返回None,视为False),此时整个条件not (...)为True,元素被加入列表- 写法更紧凑,但可读性略低于第一种方法,适合追求代码简洁的场景。
两种方法最终输出均与期望结果一致,可根据自己的习惯选择使用。
内容的提问来源于stack exchange,提问作者user12269799
相关产品推荐
相关产品推荐

