您好,匿名用户
随意问技术百科期待您的加入

python遍历删除字典里值为空的元素报错

0 投票
exam = { 'math': '95', 'eng': '96', 'chn': '90', 'phy': '', 'chem': '' }

使用下列遍历的方法删除:

for e in exam:
    if exam[e] == '':
        del exam[e]

结果出现下列错误,怎么解决:

Traceback (most recent call last):
  File "Untitled.py", line 3, in <module>
    for e in exam:
RuntimeError: dictionary changed size during iteration
用户头像 提问 2013年 11月14日 @ Galio 上等兵 (289 威望)
分享到:

1个回答

0 投票
 
最佳答案
for e in exam.keys():
    if exam[e] == '':
        del exam[e]
for e in exam:

使用的是迭代器,它等于:

>>> exam = { 'math': '95', 'eng': '96', 'chn': '90', 'phy': '', 'chem': '' }
>>> fetch = iter(exam)
>>> while True:
...     try:
...         key = fetch.next()
...     except StopIteration:
...         break
...     if exam[key] == '':
...         del exam[key]
... 

只是在for循环中,它会自动调用next方法!

字典的迭代器会遍历它的键,在这个过程中,不能改变这个字典!exam.keys()返回的是一个独立的列表。

下面是来自PEP234的snapshot:

Dictionaries implement a tp_iter slot that returns an efficient
iterator that iterates over the keys of the dictionary. During
such an iteration, the dictionary should not be modified, except
that setting the value for an existing key is allowed (deletions or additions are not, nor is the update() method).
用户头像 回复 2013年 11月14日 @ Annie 上等兵 (299 威望)
选中 2013年 9月7日 @Galio
提一个问题:

相关问题

0 投票
1 回复 47 阅读
用户头像 提问 2012年 12月1日 @ Renekton 上等兵 (260 威望)
+2 投票
1 回复 50 阅读
用户头像 提问 2012年 12月31日 @ Saber 中士 (1,234 威望)
0 投票
1 回复 38 阅读
用户头像 提问 2013年 12月28日 @ 正能量 上等兵 (297 威望)
0 投票
1 回复 68 阅读
用户头像 提问 2012年 12月1日 @ Nautilus 上等兵 (223 威望)
0 投票
1 回复 28 阅读
用户头像 提问 2013年 11月15日 @ Redis 上等兵 (114 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...