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
相关产品推荐
相关产品推荐

