关于python:RuntimeError:字典在迭代期间改变了大小 – 如何解决?

RuntimeError: dictionary changed size during iteration - how to solve?

我正试图遍历一本字典,如果所有的键都是字符串,那么就将它们大写。我收到一个运行时错误:

1
2
3
4
5
for k, v in ref_dict.items():
    if isinstance(k, str):
        ref_dict[k.upper()] = v
    else:
        ref_dict[k] = v

我该如何避免这样的事情?或者,更好的方法是,如何改进代码以更优雅地解决这个问题?


你的口述有多大?如果不是很大,那么你可以:

1
2
3
4
5
6
7
8
new_dict = {}
for k, v in ref_dict.items():
    if isinstance(k, str):
        new_dict[k.upper()] = v
    else:
        new_dict[k] = v

ref_dict = new_dict

在另一种情况下,您可能需要检查您创建的ref_dict并修改其中的键。

另外,您还可以修改原始代码,如下更改ref_dict。但值得一提的是,它将为ref_dict添加新元素。例如

1
2
3
4
5
6
7
8
9
10
11
12
13
ref_dict = {'abc' : 1}

### change of code
keys = [k for key in ref_dict]

for k in keys:
    if isinstance(k, str):
        ref_dict[k.upper()] = ref_dict[k]
    # else part is not neccessary
    # else:
    #     ref_dict[k] = v

# now ref_dict = {'abc':1, 'ABC':1}


我通过这样做解决了它:

1
2
final_dict = dict((str(k).upper(), v) for k, v in ref_dict.items())
return final_dict

str应用程序并不理想,但目前仍将如此。