Python字典键值替换:将d2元素替换为d1对应值
线性复杂度实现字典列表元素的映射替换
需求说明
现有两个Python字典d1和d2:
d1={569328: float('inf'), 574660: float('inf'), 1187498: 1, 1226468: 2, 1236571: float('inf'), 1239098: 1, 1239277: 5, 1239483: float('inf'), 1239622: 9, 1239624: float('inf'), 1239749: float('inf'), 1334477: 6, 1340405: float('inf'), 1340418: float('inf'), 1340462: 2, 1340471: float('inf')}
d2={596005: [569328], 4321416: [1334477, 1187498], 5802640: [569328, 1226468], 6031690: [569328, 1340462, 1239622, 1187498, 1239277]}
需要将d2中每个列表里的元素,替换为d1中对应键的值,最终得到目标字典d3:
d3={596005: [float('inf')], 4321416: [6, 1], 5802640: [float('inf'), 2], 6031690: [float('inf'), 2, 9, 1, 5]}
要求方案为线性复杂度,且代码简洁。
解决方案
直接用字典推导式嵌套列表推导式即可,这是最简洁且符合线性复杂度要求的实现:
d3 = {key: [d1[item] for item in value_list] for key, value_list in d2.items()}
补充说明
- 复杂度分析:遍历
d2的每个键值对是O(M)(M为d2的键数量),再遍历每个列表内的元素是O(K)(K为所有列表元素的总个数),整体时间复杂度为O(M+K),属于线性复杂度,完全适配大数据量场景。 - 异常处理:如果
d2的列表中存在d1里没有的键,直接用d1[item]会抛出KeyError。这种情况可以改用d1.get(item, 默认值)避免报错,示例如下:# 示例:默认值设为None d3 = {key: [d1.get(item, None) for item in value_list] for key, value_list in d2.items()} - 代码中的
float('inf')是Python表示无穷大的标准写法,和原示例中的inf等价(原示例大概率提前导入了from math import inf,两种写法均可)。
内容的提问来源于stack exchange,提问作者Lusian
相关产品推荐
相关产品推荐

