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

Python:如何重命名嵌套字典中的重复键并保留顺序

解决Python嵌套字典中重复键的重命名问题

首先明确核心问题:Python标准字典不允许重复键,当你定义多个'---'键时,后续的键会直接覆盖前面的,所以你的递归函数根本遍历不到所有分隔符条目——这就是为什么最终只保留了部分分隔符的原因。

解决方案思路

  1. 先改用列表存储所有菜单条目(每个条目是键值对元组),避免重复键被覆盖;
  2. 写递归函数将列表转换为带有唯一分隔符键的字典,用递推计数替代全局变量,保证每个分隔符键唯一;
  3. 如果必须从字典开始,要在动态生成字典的阶段就处理重复键,提前生成唯一标识。

具体代码实现

第一步:用列表存储完整菜单条目

先把菜单结构改成列表形式,这样不会丢失任何重复的分隔符:

MenuItemsList = [
    ('Title', [0]),                # Text
    ('---', [1]),                  # Separator
    ('MenuItem 1', [3, [
        ('SubItem 1', [2, 1000]),  # Submenu item with value
        ('---', [1]),
        ('SubItem 2', [2, 2000]),
        ('---', [1]),
        ('SubItem 3', [2, 3000])
    ]]),
    ('---', [1]),
    ('MenuItem2', [2, 4000])
]

第二步:递归转换为带唯一键的字典

编写递归函数处理列表,给每个分隔符生成唯一键,同时递归处理子菜单:

def convert_to_unique_menu(items, separator_count=1):
    menu_dict = {}
    for key, value in items:
        if value[0] == 1:
            # 重命名分隔符,使用当前计数
            new_key = f"Separator {separator_count}"
            menu_dict[new_key] = value
            separator_count += 1
        elif value[0] == 3:
            # 递归处理子菜单,传递当前计数
            sub_menu, separator_count = convert_to_unique_menu(value[1], separator_count)
            menu_dict[key] = (value[0], sub_menu)
        else:
            # 其他类型直接保留原键
            menu_dict[key] = value
    return menu_dict, separator_count

# 生成最终的菜单字典
final_menu, _ = convert_to_unique_menu(MenuItemsList)

# 打印结果验证
import pprint
pprint.pprint(final_menu)

执行结果

转换后的字典会包含所有分隔符,且每个分隔符的键都是唯一的:

{'MenuItem 1': (3,
                {'Separator 2': [1],
                 'Separator 3': [1],
                 'SubItem 1': [2, 1000],
                 'SubItem 2': [2, 2000],
                 'SubItem 3': [2, 3000]}),
 'MenuItem2': [2, 4000],
 'Separator 1': [1],
 'Separator 4': [1],
 'Title': [0]}

如果你坚持要从原始字典入手

如果你的菜单必须从字典生成,那么在动态构建字典的阶段,就要避免重复的'---'键。比如在添加分隔符时,直接生成唯一键:

# 示例:动态构建菜单字典时处理分隔符
menu = {}
sep_count = 1

# 添加标题
menu['Title'] = [0]
# 添加分隔符
menu[f"Separator {sep_count}"] = [1]
sep_count += 1
# 添加子菜单
sub_menu = {}
sub_menu['SubItem 1'] = [2, 1000]
sub_menu[f"Separator {sep_count}"] = [1]
sep_count += 1
sub_menu['SubItem 2'] = [2, 2000]
sub_menu[f"Separator {sep_count}"] = [1]
sep_count += 1
sub_menu['SubItem 3'] = [2, 3000]
menu['MenuItem 1'] = [3, sub_menu]
# 继续添加其他条目...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:05:13