Python如何在单行字典推导式中高效转换键为int类型
问题背景
- 现有两个字典,其中
dict_a_to_c数据量极大:
dict_a_to_c = {'803': 2, '808': 8, '30': 9, '37': 11, '38': 12, '39': 13, '481': 18, '816': 21, .....} # length of dict_a_to_c is huge. dict_a_to_b = {480:2, 37:5, 40: 9, 816:20, 148: 18}
- 原有实现逻辑为先全量转换
dict_a_to_c的键为int类型,再通过字典推导式生成映射结果dict_c_to_b,代码如下:
# converting key of dict_a_to_c to int dict_a_to_c = {int(key):value for key, value in dict_a_to_c.items()} dict_c_to_b = {dict_a_to_c[k]: dict_a_to_b[int(k)] for k in dict_a_to_b if k in dict_a_to_c}
- 上述代码运行后
dict_c_to_b的输出为{11: 5, 21: 20} - 现存问题:
dict_a_to_c数据量过大,全量转换其所有键的类型性能损耗过高,需要在构建dict_c_to_b的逻辑中直接完成必要的键类型转换,高效实现映射需求。
高效实现方案
核心思路是完全避免全量遍历大字典做类型转换,只遍历数据量更小的dict_a_to_b,仅对当前参与匹配的键做类型转换,把时间开销从和大字典规模绑定,降到和小字典规模绑定。
单行字典推导式实现如下:
dict_c_to_b = {dict_a_to_c[str(k)]: v for k, v in dict_a_to_b.items() if str(k) in dict_a_to_c}
性能优势说明
- 不需要修改原始大字典
dict_a_to_c的任何内容,省去了全量遍历大字典做键类型转换的O(n)开销 - 循环遍历的对象是键数更少的
dict_a_to_b,循环次数和小字典长度一致,不受大字典规模影响 - 仅对当前遍历到的小字典键做1次
str()转换,用来匹配大字典的字符串键,类型转换的次数等于小字典的键数,远小于全量转换大字典键的转换次数 - 字典的键存在判断、取值都是O(1)操作,整体逻辑没有额外性能损耗,运行结果和原有方案完全一致
内容的提问来源于stack exchange,提问作者yogesh
相关产品推荐
相关产品推荐

