求助:如何将普通字典转换为三重有序反转字典?
实现三重有序反转字典的解决方案
我明白你想要把普通字典转换成这种「三重有序反转字典」的需求——核心是先按值的出现频率分组,再把同一频率的键值映射归到一起,最后给每个频率组分配有序的外层键。咱们一步步来实现这个通用功能:
步骤拆解
- 收集值对应的所有键:先遍历原字典,把每个值对应的所有键都收集到列表里,同时也就得到了每个值的出现次数(就是列表的长度)。
- 按出现频率分组:把拥有相同出现次数的值-键列表,归到同一个内层字典中。
- 分配有序外层键:给每个频率组分配从1开始的有序序号作为外层键,得到最终的三重字典。
完整代码实现
from collections import defaultdict def convert_to_triple_reversed_dict(original_dict): # 第一步:收集每个值对应的所有键 value_to_keys = defaultdict(list) for key, value in original_dict.items(): value_to_keys[value].append(key) # 第二步:按值的出现次数(即键列表的长度)分组 frequency_groups = defaultdict(dict) for val, keys_list in value_to_keys.items(): occurrence_count = len(keys_list) frequency_groups[occurrence_count][val] = keys_list # 第三步:将频率组转换为有序的外层键(从1开始递增) # 先按出现次数从小到大排序,再分配序号 sorted_frequency_groups = sorted(frequency_groups.items(), key=lambda x: x[0]) result_dict = {index + 1: group for index, (count, group) in enumerate(sorted_frequency_groups)} return result_dict # 测试你的示例字典 test_dict = {1: 1, 3: 3, 5: 6, 6: 6} print(convert_to_triple_reversed_dict(test_dict)) # 输出:{1: {1: [1], 3: [3]}, 2: {6: [5, 6]}}
代码说明
- 第一步用
defaultdict(list)可以自动帮我们初始化空列表,避免手动判断值是否存在,遍历原字典时直接把键追加到对应值的列表中,得到{1: [1], 3: [3], 6: [5, 6]}。 - 第二步遍历第一步的结果,用每个键列表的长度(也就是值的出现次数)作为分组键,把值和对应的键列表放到该分组的字典里,此时得到的
frequency_groups是{1: {1: [1], 3: [3]}, 2: {6: [5, 6]}},已经接近目标,只是外层键是出现次数本身。 - 第三步通过排序确保分组按出现次数从小到大排列,再用
enumerate给每个组分配从1开始的有序序号,替换掉原来的次数键,就得到了你想要的预期输出。
这个函数是通用的,不管你替换成什么字典,只要是键值对结构,都能生成对应的三重有序反转字典。
内容的提问来源于stack exchange,提问作者RohitMallampati
相关产品推荐
相关产品推荐

