字典转换需求:将多元素列表值逐一分配给对应键
解决方案:字典多元素列表的一键一值分配
嘿,这个问题核心其实就是把共享相同值列表的键组,和列表元素做一一映射,我给你写个高效的实现,完美兼容单元素和多元素的情况:
思路拆解
- 分组:先把所有键按照它们对应的列表(转成元组,因为列表不能当字典键)分组,这样拥有相同列表的键会被归为一组;
- 分配:对每个组,把组内的键和列表里的元素一一配对,每个键分配唯一的元素(顺序不限,完全满足你的需求)。
完整代码实现
from collections import defaultdict def transform_dict(D): # 1. 按值列表分组(将列表转为元组作为分组键) groups = defaultdict(list) for key, value in D.items(): groups[tuple(value)].append(key) # 2. 给每个组的键分配对应的元素 for values, keys in groups.items(): # 题目保证键数和元素数一致,这里加个断言做校验(可选) assert len(keys) == len(values), "键的数量与元素数量不匹配,不符合题目要求" # 一一配对分配,顺序不限 for key, val in zip(keys, values): D[key] = val return D
测试示例
用你给出的输入测试:
# 输入字典 D = { 0: [7], 1: [5], 2: [4], 3: [1, 2, 3], 4: [6, 8], 5: [1, 2, 3], 6: [1, 2, 3], 7: [6, 8] } # 转换后 result = transform_dict(D) print(result)
输出(字典顺序可能因Python版本略有不同,但分配逻辑正确):
{0: 7, 1: 5, 2: 4, 3: 1, 4: 6, 5: 2, 6: 3, 7: 8}
为什么这个方案高效?
- 时间复杂度是O(M),M是字典中键的总数,只需要两次遍历字典;
- 自动兼容单元素列表的情况(单元素列表的组只有一个键,直接分配唯一元素);
- 逻辑清晰,分组后配对的方式完全符合题目中"相同数量的不同键对应相同列表"的前提。
如果需要指定分配顺序(比如按键的大小排序分配元素),只需要把zip(keys, values)改成zip(sorted(keys), sorted(values))即可,非常灵活。
内容的提问来源于stack exchange,提问作者Mathieu
相关产品推荐
相关产品推荐

