Python实现函数结果按参数分组存字典的更优方法?
按函数执行结果分组参数的最优实现方案
方案1:使用collections.defaultdict(最推荐,性能最优)
无需手动判断键是否存在,底层自动处理初始化逻辑,全程列表原地修改无拷贝开销:
from collections import defaultdict resultsdict = defaultdict(list) for item in collection: result = func(item) resultsdict[result].append(item)
如果需要最终得到普通字典而非defaultdict对象,最后补充一行resultsdict = dict(resultsdict)即可。
方案2:使用字典原生setdefault方法(无需导入依赖)
不需要引入额外模块,同样避免了显式的if-else判断,也没有列表拷贝的性能问题:
resultsdict = {} for item in collection: result = func(item) resultsdict.setdefault(result, []).append(item)
setdefault的逻辑是:如果键result存在就返回对应的列表,不存在就先把该键的值设为空列表再返回,所以可以直接调用append原地添加元素。
其他说明
你提到的三元表达式写法每次都会生成新的列表对象,当collection数据量较大时,内存开销和执行效率都会明显低于上面两种方案,不建议使用。
补充一种场景受限的实现:如果允许先对参数集合排序,可以用itertools.groupby,但该方法要求相同结果的参数必须连续排列,需要额外排序开销,仅适合本身就有序或者需要排序结果的场景:
from itertools import groupby resultsdict = { k: list(v) for k, v in groupby(sorted(collection, key=func), key=func) }
注意该方法会调用两次func(排序一次、分组一次),如果func本身执行开销大,会进一步拉低性能。
内容的提问来源于stack exchange,提问作者hpchavaz
相关产品推荐
相关产品推荐

