如何处理反向字典重复值,生成符合预期的映射列表
轮换映射重复值对应的字典键
需求说明
给定列表 my_list = (1, 2, 3, 3, 4) 和字典 my_dict = {'Apple': 1, 'Orange': 2, 'Banana': 3, 'Kiwi': 3, 'Pear': 4},需要将列表中的数值映射为对应的水果名称。要求遇到重复数值时,轮换使用字典中对应的不同键,最终得到目标输出 ['Apple', 'Orange', 'Banana', 'Kiwi', 'Pear'],而非反向字典导致的重复结果。
原代码问题分析
原代码每次循环都重新生成反向字典 {my_dict[k]:k for k in my_dict},但字典的键具有唯一性,相同数值对应的后一个键会覆盖前一个(比如数值3对应的Kiwi会覆盖Banana),导致每次取数值3时只能得到最后一个对应的键,无法实现轮换。
解决方案代码
my_list = (1, 2, 3, 3, 4) my_dict = {'Apple': 1, 'Orange': 2, 'Banana': 3, 'Kiwi': 3, 'Pear': 4} # 构建「数值到对应水果列表」的映射 value_to_fruits = {} for fruit, val in my_dict.items(): if val not in value_to_fruits: value_to_fruits[val] = [] value_to_fruits[val].append(fruit) # 为每个数值初始化轮换计数器 counters = {val: 0 for val in value_to_fruits} new_list = [] for num in my_list: fruit_options = value_to_fruits[num] # 取出当前计数器指向的水果 selected = fruit_options[counters[num]] new_list.append(selected) # 更新计数器,取模实现循环轮换 counters[num] = (counters[num] + 1) % len(fruit_options) print(new_list) # 输出结果: ['Apple', 'Orange', 'Banana', 'Kiwi', 'Pear']
代码解释
- 构建多值映射:遍历原字典,把同一个数值对应的所有水果名称收集到列表中,避免了反向字典的键覆盖问题。
- 计数器轮换:为每个数值维护一个计数器,每次取出对应水果后,计数器加1并对水果列表长度取模,确保索引不会越界,实现循环轮换效果。
- 遍历生成结果:逐个处理原列表中的数值,按计数器指向的索引取出水果,最终得到符合要求的结果列表。
内容的提问来源于stack exchange,提问作者Matt Smit
相关产品推荐
相关产品推荐

