如何使用Python3单行代码重构指定结构的嵌套字典?
实现目标字典结构转换的简洁Python3代码
当然可以用简洁的单行或近单行代码实现,这里提供几种实用方案:
无依赖单行实现
无需导入任何模块,利用字典的setdefault方法配合列表推导式完成:
out_dict = {}; [out_dict.setdefault(k[0], []).append({k[1]: v}) for k, v in in_dict.items()]
setdefault会自动为不存在的ID键创建空列表,随后我们将每个{TEXT: TIMESTAMP}形式的字典追加到对应列表中。虽然列表推导式会生成一个由None组成的临时列表,但这个结果可以直接忽略,核心逻辑已经完成字典的构建。如果需要严格的单行(不使用分号),可以用嵌套lambda:
out_dict = (lambda d: [d.setdefault(k[0], []).append({k[1]: v}) for k, v in in_dict.items()] or d)({})
借助collections.defaultdict的实现
如果想避免临时列表的生成,用defaultdict会更直观:
from collections import defaultdict out_dict = defaultdict(list); [out_dict[k[0]].append({k[1]: v}) for k, v in in_dict.items()] # 若需转为普通字典而非defaultdict,执行: # out_dict = dict(out_dict)
基于分组的实现(itertools.groupby)
通过分组操作实现逻辑更清晰的转换,需先按ID排序以保证同ID项连续:
from itertools import groupby from operator import itemgetter out_dict = {id_: [{text: ts} for (_, text), ts in group] for id_, group in groupby(sorted(in_dict.items(), key=itemgetter(0)), key=lambda x: x[0][0])}
这些方案都比常规for循环更简洁,其中无依赖的单行实现是最轻量化的选择。
内容的提问来源于stack exchange,提问作者Jeef
相关产品推荐
相关产品推荐

