Python新手求助:如何高效将字典键替换为连续整数?
问题解答:将字典键替换为连续索引0,1,2,...
先看你代码的问题
你的代码运行报错主要有这几个原因:
for i in p_length:p_length是整数,不能直接迭代,得用range(p_length)生成索引序列p_deck[i]={p_keys_list[i]:p_values_list[i]}:这里错误地把值包装成了嵌套字典,应该直接赋值p_deck[i] = p_values_list[i]- Python3中
dict.keys()和dict.values()返回的是视图对象,不是列表,直接用索引会报错,需要转成list - 全局变量完全没必要,反而容易引发变量作用域问题
最简洁高效的实现方法
你只需要保留原字典值的顺序,把键替换为从0开始的连续整数,用字典推导式+enumerate是最直接高效的方式:
p_deck = {3:12, 5:23, 6:8, 9:47, 10:18} p_deck = {i: val for i, val in enumerate(p_deck.values())}
enumerate(p_deck.values())会遍历原字典的值,同时生成从0开始的索引,字典推导式直接一步构建新字典。Python3.7+的字典默认保留插入顺序,完全能满足你的需求。
另一种等价实现
如果习惯用zip,也可以这么写:
p_deck = dict(zip(range(len(p_deck)), p_deck.values()))
range(len(p_deck))生成0到n-1的索引序列,和原字典的值一一对应后,用dict()直接转成新字典。
你的代码修正版(仅作错误演示,不推荐)
如果一定要基于你的思路改,修正后是这样:
p_deck = {3:12, 5:23, 6:8, 9:47, 10:18} def order(): p_values_list = list(p_deck.values()) p_length = len(p_deck) new_deck = {} for i in range(p_length): new_deck[i] = p_values_list[i] return new_deck p_deck = order()
核心修正:去掉全局变量、把视图对象转成列表、用range迭代索引、直接赋值值而非嵌套字典。
关于拆分重组的问题
你原来拆分键值再重组的方法确实过于繁琐,Python提供了很多内置工具可以直接完成这类操作,不需要手动拆分列表再循环赋值,既简洁又高效。
内容的提问来源于stack exchange,提问作者Muppet
相关产品推荐
相关产品推荐

