Python如何用单行Pythonic方式构建值为可变长度列表的字典
可行的Pythonic单行实现方案
你当前用defaultdict的实现已经是性能最优、可读性最高的写法,如果需要更简洁的单行实现,有两种常用方案:
方案1:无需额外导入,基于dict.setdefault实现
n = {}; for i in range(1000): n.setdefault(sum(int(d) for d in str(i)), []).append(i)
如果已经提前定义了sumdigits函数,可以简化为:
def sumdigits(x): return sum(int(i) for i in str(x)) n = {}; for i in range(1000): n.setdefault(sumdigits(i), []).append(i)
方案2:基于itertools.groupby的字典推导式实现
需要注意groupby只能合并连续的同键元素,必须先按各位数字和排序再分组:
from itertools import groupby n = {k: list(v) for k, v in groupby(sorted(range(1000), key=lambda x: sum(int(i) for i in str(x))), key=lambda x: sum(int(i) for i in str(x)))}
同样如果提前定义了sumdigits函数可以大幅简化:
n = {k: list(v) for k, v in groupby(sorted(range(1000), key=sumdigits), key=sumdigits)}
方案对比
- 你原有
defaultdict的实现时间复杂度为O(n),是性能最优的选择,可读性也最高,实际开发中更推荐使用,不需要刻意追求单行写法 setdefault单行写法性能接近原有实现,不需要额外导入依赖groupby方案因为多了一步排序操作,时间复杂度为O(n log n),数据量较大时性能差距会非常明显,仅适合小数据量场景使用
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

