如何快速移除Python字典列表中的指定公共键?
问题
我有一个字典列表:
res = [ {'termA':'A1', 'termB':'B1', 'termC':'C1'}, {'termA':'A2', 'termB':'B2', 'termC':'C2'}, {'termA':'A3', 'termB':'B3', 'termC':'C3'} ]
每个字典的键都相同,对应值不同(类似矩阵结构)。我想找到最快的方法,从所有字典中移除/提取特定键(比如移除termA和termB,只保留termC)。
我最初用for循环实现:
new = [] for i in res: new.append({'termC':i['termC']})
能得到预期结果:
new = [{'termC':'C1'},{'termC':'C2'},{'termC':'C3'}]
但数据量一大速度就很慢,列表推导式的表现也不理想。试过转成DataFrame,耗时同样很长。有没有更优的解决方案?
解决方案
对于大规模数据,避免Python层面的逐元素循环是提速关键,优先用底层C实现的工具:
1. 用operator.itemgetter批量提取(效率远超纯Python循环)
operator.itemgetter是C实现的,比普通循环/推导式快很多。
- 只保留单个键的情况:
from operator import itemgetter keep_key = 'termC' getter = itemgetter(keep_key) new = [{keep_key: getter(d)} for d in res]
- 保留多个键的情况(比如同时留
termB和termC):
keep_keys = ('termB', 'termC') getter = itemgetter(*keep_keys) new = [dict(zip(keep_keys, getter(d))) for d in res]
2. 直接生成值列表(最快方案,若不需要字典结构)
如果最终不需要字典格式,只是要termC的值列表,这是最快的方式——完全省去了构建新字典的开销:
# 列表推导式版本 new = [d['termC'] for d in res] # 更高效的itemgetter+map版本 new = list(map(itemgetter('termC'), res))
3. 优化版列表推导式(无额外依赖)
如果不想引入库,优化后的列表推导式比原始for循环快(减少了append的调用开销):
new = [{'termC': d['termC']} for d in res]
为什么DataFrame不适合?
把字典列表转成DataFrame本身就有不小的开销,包括类型推断、数据结构转换等,对于大规模数据来说,这个转换成本远高于直接处理字典列表,所以不建议用这种方式。
内容的提问来源于stack exchange,提问作者chikako
相关产品推荐
相关产品推荐

