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

发布于 2022-08-24 13:21:22 字数 367 浏览 13 评论 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

断肠人 2022-08-31 13:21:22
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).

柒七 2022-08-31 13:21:22
dict(filter(lambda x: x[1] != '', exam.items()))
苍白女子 2022-08-31 13:21:22

在使用迭代器遍历的过程中不能删除、添加数据

帅冕 2022-08-31 13:21:22

先记录要删除的元素的索引,遍历完后再删除

自此以后,行同陌路 2022-08-31 13:21:22
for k, v in exam.items():
    if not v: exam.pop(k)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文