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

如何高效从不同长度的列表的列表中筛选元素组合唯一的有序列表?

高效去重列表中的子列表(保持元素有序)

首先,咱们得明确需求:要从包含不同长度子列表的大列表里,高效筛选出元素组合唯一的子列表,而且每个子列表本身的元素是有序的(从输入示例来看,原列表的子列表已经是有序的;如果输入存在无序的子列表,咱们也可以先做排序处理)。

核心思路

因为列表是不可哈希的,没法直接放进集合里去重,所以咱们可以把每个子列表转换成可哈希的类型(比如元组),用集合来记录已经出现过的子列表,然后遍历原列表,只保留第一次出现的子列表。这样既能保证高效,又能维持原列表的顺序(和示例输出的顺序一致)。

代码实现

input_list = [[1,2], [3,4,5], [3,4], [3,4,5]]

seen = set()
result = []
for sublist in input_list:
    # 若输入子列表可能无序,可替换为 tuple(sorted(sublist))
    tuple_sublist = tuple(sublist)
    if tuple_sublist not in seen:
        seen.add(tuple_sublist)
        result.append(sublist)

print(result)  # 输出: [[1,2], [3,4,5], [3,4]]

关键点解释

  • 用元组转存:元组是不可变类型,可以被哈希,因此能放进集合里快速判断是否已存在,查询时间复杂度为O(1)。
  • 维持原顺序:遍历原列表时,仅在首次遇到某个子列表时将其加入结果,保证结果中子列表的顺序与原列表中首次出现的顺序一致。
  • 高效性:整个过程的时间复杂度为O(n * k),其中n是原列表长度,k是子列表的平均长度(主要耗时在元组转换),对于大型列表来说这个效率非常可观。

额外场景处理

如果输入的子列表本身不是有序的,且需要将元素组合相同但顺序不同的子列表视为重复项(比如[2,1]和[1,2]),只需修改元组转换的步骤:

tuple_sublist = tuple(sorted(sublist))

这样就能确保只要元素组合一致,无论内部顺序如何都会被判定为重复项。

内容的提问来源于stack exchange,提问作者Oleg Dats

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:23:10