You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理反向字典重复值,生成符合预期的映射列表

轮换映射重复值对应的字典键

需求说明

给定列表 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. 构建多值映射:遍历原字典,把同一个数值对应的所有水果名称收集到列表中,避免了反向字典的键覆盖问题。
  2. 计数器轮换:为每个数值维护一个计数器,每次取出对应水果后,计数器加1并对水果列表长度取模,确保索引不会越界,实现循环轮换效果。
  3. 遍历生成结果:逐个处理原列表中的数值,按计数器指向的索引取出水果,最终得到符合要求的结果列表。

内容的提问来源于stack exchange,提问作者Matt Smit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:46:08