删除中间条目后,如何重新索引Python字典使其键连续?
解决Python字典删除键后重新生成连续索引键的问题
直接遍历字典的.keys()并修改键会出问题——因为迭代字典时修改其结构(增删键)会触发异常或遍历异常。正确的做法是重新构建字典,给值分配连续的索引键,以下是两种可靠方法:
方法一:利用字典值直接重建(Python 3.7+适用)
Python 3.7及以上的字典会保留插入顺序,直接用enumerate遍历字典的.values(),给每个值分配新的连续索引:
# 删除键后的字典 my_dict = { 0: {"item_one": "a", "item_two": "b"}, 2: {"item_one": "e", "item_two": "f"} } # 重建字典,生成连续索引键 my_dict = {i: val for i, val in enumerate(my_dict.values())} # 输出结果:{0: {'item_one': 'a', 'item_two': 'b'}, 1: {'item_one': 'e', 'item_two': 'f'}} print(my_dict)
方法二:兼容旧版本Python(低于3.7)
旧版本字典不保证顺序,需要先对原键排序,再按排序后的键取值重建:
# 删除键后的字典 my_dict = { 0: {"item_one": "a", "item_two": "b"}, 2: {"item_one": "e", "item_two": "f"} } # 先排序原字典的键,再分配新索引 sorted_keys = sorted(my_dict.keys()) my_dict = {i: my_dict[key] for i, key in enumerate(sorted_keys)} # 输出结果同上 print(my_dict)
为什么直接修改键会失败?
当你遍历.keys()时,字典的键集合是动态的。如果在遍历过程中删除旧键、添加新键,会打乱迭代器的状态,要么跳过元素,要么直接抛出RuntimeError: dictionary changed size during iteration异常。所以必须先获取所有需要保留的值(或排序后的键值对),再重新构建新字典。
内容的提问来源于stack exchange,提问作者Brendan
相关产品推荐
相关产品推荐

