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

如何高效将字典元素按频率展开为列表?(百万级数据优化)

高效展开频率字典为列表的方案

假设有一个包含百万条记录的字典,其中键代表元素,值代表对应出现频率。示例字典如下:

d = {1:2, 2:4, 3:5}

我们需要生成展开后的列表:

[1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3]

原实现采用嵌套循环,代码如下:

lst=[]
for key, freq in d.items():
  for _ in range(freq):
    lst.append(key)

print(lst)
#[1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3]

这种写法频繁调用append,可能因多次列表扩容产生额外开销,对于百万级数据效率偏低;即使改用列表推导式,本质仍是嵌套循环,性能提升有限。以下是更优雅高效的解决方案:

方案1:使用itertools.chain.from_iterable

利用itertools的迭代器工具,结合元素重复的方式实现高效拼接:

import itertools

d = {1:2, 2:4, 3:5}
# 用列表推导生成重复元素的子列表,再通过chain拼接
lst = list(itertools.chain.from_iterable([key]*freq for key, freq in d.items()))

如果想进一步降低内存占用(尤其是处理超大频率值时),可以用生成器表达式替代列表推导:

lst = list(itertools.chain.from_iterable((key for _ in range(freq)) for key, freq in d.items()))

优势:chain.from_iterable直接迭代拼接子序列,避免了中间大列表的内存占用;[key]*freq一次性创建重复元素列表,比循环append的内存分配更高效。

方案2:使用numpy的向量化操作

针对百万级别的大数据量,numpy的底层C实现能带来显著的性能提升:

import numpy as np

d = {1:2, 2:4, 3:5}
keys = np.array(list(d.keys()))
freqs = np.array(list(d.values()))
# 利用numpy.repeat实现向量化重复
lst = np.repeat(keys, freqs).tolist()

优势:向量化操作避开了Python层面的循环开销,处理大规模数据时速度远优于纯Python实现。

内容的提问来源于stack exchange,提问作者Talha Tayyab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:27:19