这个程序是一个需要字典的函数,它必须返回一个带有原始字典镜像的新字典(意思是键:值对被切换)。
然而,根据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
答案 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()
电话。