代码之家  ›  专栏  ›  技术社区  ›  sgerbhctim

运行时错误:字典在迭代期间更改了大小-如何解决?

  •  0
  • sgerbhctim  · 技术社区  · 7 年前

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

    for k, v in ref_dict.items():
        if isinstance(k, str):
            ref_dict[k.upper()] = v
        else:
            ref_dict[k] = v
    

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Quang Hoang    7 年前

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

    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 = {'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}
    
        2
  •  0
  •   sgerbhctim    7 年前

    我通过这样做解决了它:

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

    这个 str 应用程序不理想,但现在可以。