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

如何移除二维列表中子列表的重复元素且保留元素顺序

如何在保留元素顺序的前提下移除二维列表中子列表的重复元素?

给定一个包含多个子列表的二维列表,需要对每个子列表进行去重操作,同时严格保留子列表中唯一元素的原有出现顺序。示例如下:

输入:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:43:10