如何用defaultdict将列表的列表转为字典:输出格式不符问题
问题:拆分列表的列表为元素与索引的一一对应键值对
给定列表的列表:
a = [[1,2],[2,3,4], [4,5,6], [3,7], [6,10]]
期望得到每个元素与其所在子列表索引的一一对应关系(注:Python标准字典不支持重复键,以下为需求展示格式):
{1: [0], 2: [0], 2: [1], 3: [1], 4: [1], 4: [2], 5: [2], 6: [2], 3: [3], 7: [3], 6: [4], 10: [4]}
当前使用defaultdict的代码:
from collections import defaultdict a = [[1,2],[2,3,4], [4,5,6], [3,7], [6,10]] clusters = defaultdict(list) cluster_sz = {} cliques = [] cluster_idx = 0 for clique in a: cliques.append(clique) for v in clique: clusters[v].append(cluster_idx) cluster_idx+=1 print(clusters)
当前输出(合并了相同元素的所有索引):
{1: [0], 2: [0,1], 3: [1,3], 4: [1, 2], 5: [2], 6: [2, 4], 7: [3], 10: [4]}
解决方案
核心说明
Python标准字典不允许存在重复键,因此无法直接生成你描述的"重复键字典"。如果需要保留每个元素与索引的一一对应关系,可通过以下方式实现:
方案1:生成键值对列表
直接遍历每个子列表及其索引,生成包含所有键值对的列表:
a = [[1,2],[2,3,4], [4,5,6], [3,7], [6,10]] result = [] for idx, clique in enumerate(a): for v in clique: result.append( (v, [idx]) ) print(result)
输出:
[(1, [0]), (2, [0]), (2, [1]), (3, [1]), (4, [1]), (4, [2]), (5, [2]), (6, [2]), (3, [3]), (7, [3]), (6, [4]), (10, [4])]
方案2:输出类似期望格式的字符串
如果只是需要打印出符合需求展示的格式(非合法Python字典),可以拼接字符串实现:
a = [[1,2],[2,3,4], [4,5,6], [3,7], [6,10]] output_parts = [] for idx, clique in enumerate(a): for v in clique: output_parts.append(f"{v}: [{idx}]") print("{" + ", ".join(output_parts) + "}")
输出:
{1: [0], 2: [0], 2: [1], 3: [1], 4: [1], 4: [2], 5: [2], 6: [2], 3: [3], 7: [3], 6: [4], 10: [4]}
内容的提问来源于stack exchange,提问作者Waqar Ali
相关产品推荐
相关产品推荐

