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

Python中如何获取含重复元素且保留顺序与数量的子列表?

高效提取列表中所有重复元素(保留原顺序与出现次数)

嘿,这个需求实现起来其实很直观,而且要做到高效也不难。核心思路就是先搞清楚哪些元素是重复出现的,再顺着原列表的顺序把这些元素都留下来就行,完全满足你要的顺序不变、数量一致的要求。

最优实现方案(Python)

咱们可以用两步走的方式,整体时间复杂度是O(n),这已经是理论上的最优了——毕竟你总得把列表至少遍历两次(一次统计频率,一次筛选):

1. 用collections.Counter统计元素频率

Counter是Python标准库提供的哈希表实现,统计频率的效率非常高,一次遍历就能搞定所有元素的出现次数。

2. 遍历原列表筛选重复元素

再走一遍原列表,把那些频率大于1的元素挑出来,这样就能完美保留原顺序和每个元素的出现次数。

完整代码示例:

from collections import Counter

def extract_duplicates(input_list):
    # 第一步:统计每个元素的出现频率
    element_counts = Counter(input_list)
    # 第二步:筛选出所有重复出现的元素,保留原顺序和次数
    return [item for item in input_list if element_counts[item] > 1]

# 测试你的示例输入
A = [1, 2, 2, 2, 3, 4, 8, 8, 9, 9]
print(extract_duplicates(A))  # 输出: [2, 2, 2, 8, 8, 9, 9]

不依赖标准库的手动实现

如果不想导入Counter,也可以自己用字典手动统计频率,逻辑是一样的,效率也差不多:

def extract_duplicates(input_list):
    element_counts = {}
    # 第一次遍历统计频率
    for item in input_list:
        element_counts[item] = element_counts.get(item, 0) + 1
    # 第二次遍历筛选元素
    return [item for item in input_list if element_counts[item] > 1]

为什么这个方案高效?

  • 时间复杂度:O(n),两次线性遍历列表,没有嵌套循环,不管列表多大,处理时间都是和列表长度成正比的。
  • 空间复杂度:O(k),k是列表中不同元素的数量,用来存储频率字典,这是无法避免的——你总得先知道哪些元素是重复的才能筛选。

关键注意点

这个方案完美符合你的需求:

  • 子列表元素的出现顺序和原列表完全一致
  • 每个元素的出现数量和原列表里的次数完全相同
  • 只会保留那些至少出现两次的元素,单次出现的元素会被过滤掉

内容的提问来源于stack exchange,提问作者Mateus Buarque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:29:44