如何修复此程序中的RuntimeError?

时间:2014-12-09 15:16:31

标签: python python-3.x dictionary

这个程序是一个需要字典的函数,它必须返回一个带有原始字典镜像的新字典(意思是键:值对被切换)。

然而,根据pythontutor.com,对于表示for循环的代码行,它会抛出RuntimeError

我使用的是最新版本的Python(3.4.1)

#Program purpose:               Write a function called rvBirthday that takes
#                               dictionary birthday as input. It returns a
#                               mirror image of the dictionary, where birthday
#                               is the key and name is the value.


def rvBirthday(birthday):
    reverseBD = {}
    for key in birthday.keys():
        date = birthday.get(key)
        birthday.pop(key)
        reverseBD[date] = key
    return reverseBD

birthday = {'Mitsuyuki Washida':'3-29-93', 'Joe Bob':'7-12-96',
        'Sam Wilson':'4-1-02'}
print(rvBirthday(birthday))

我得到的错误是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in rvBirthday
RuntimeError: dictionary changed size during iteration

1 个答案:

答案 0 :(得分:3)

您正在使用dict.pop()更改输入字典,同时在其上循环。这会改变字典大小,从而打破迭代。

您的说明没有说明从输入词典中删除键。完全删除dict.pop()来电。

您也不需要在这里使用.keys().get()。循环在字典上会产生密钥,因此您不必使用单独的方法来提取密钥。然后你知道那些键在字典中,所以.get()如果缺少则返回默认值也是多余的。

更好地循环字典项目;这一步为您提供了关键和价值:

def rvBirthday(birthday):
    reverseBD = {}
    for key, date in birthday.items():
        reverseBD[date] = key
    return reverseBD

这也可以用词典理解来表达:

def rvBirthday(birthday):
    return {date: key for key, date in birthday.items()}

如果您仍然需要清除输入字典,只需在复制键值对后添加birthday.clear()电话