首页 > 编程问答 >在 python3 中迭代字典键时无法删除它:“RuntimeError:字典在迭代期间更改了大小”

在 python3 中迭代字典键时无法删除它:“RuntimeError:字典在迭代期间更改了大小”

时间:2024-07-21 10:56:54浏览次数:10  
标签:python python-3.x dictionary

我试图在迭代字典时从字典中删除一个键。从字典中删除键时,我得到:
RuntimeError: dictionary changed size during iteration

我的代码:

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}

for k, v in mydict.items():
    if k == 'two':
        del(mydict[k])
        continue
    print(k)

为了避免这种情况,我将同一字典复制到另一个字典,然后在迭代前一个字典时尝试从复制的字典中删除内容。但我仍然收到错误。

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}

new_dict = mydict
for k, v in mydict.items():
    if k == 'two':
        del(new_dict[k])
        continue
    print(k)

所以任何人都可以帮助解决这个问题。


你收到此错误是因为你无法在迭代字典本身的同时修改字典。Python 不会跟踪你对字典所做的更改,并且当你继续迭代时,它会混淆,因为它不再与迭代开始时的字典相同。

以下是解决此问题的两种方法:

1. 使用字典推导式创建新字典:

这是最 Pythonic 的方法。你可以使用字典推导式创建一个新的字典,其中只包含你想要保留的项:

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}

mydict = {k: v for k, v in mydict.items() if k != 'two'}

print(mydict)

此代码创建一个新的字典 mydict ,该字典包含原始字典中除 'two' 以外的所有键值对。

2. 迭代字典副本:

你可以创建一个字典副本并迭代该副本,同时修改原始字典。这允许你修改原始字典,而不会在迭代过程中遇到问题。

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}

for k, v in mydict.copy().items():
    if k == 'two':
        del mydict[k]

print(mydict)

此代码迭代字典副本 ( mydict.copy() ),如果键等于 'two' ,它会从原始字典 mydict 中删除该项。

这两种方法都可以实现你想要的结果,而不会引发“RuntimeError”。选择哪种方法取决于你的个人喜好和代码的具体上下文。

标签:python,python-3.x,dictionary
From: 49444511

相关文章

  • Python pyTelegramBotAPI:设置不受循环影响的变量
    我想创建一个基本上是布尔值的变量(无论机器人是否工作)。但是,当使用TeleBot.polling()时,脚本开始无限循环,所以如果我在代码开头设置一个变量就像:is_bot_working=True,变量将始终为真,反之亦然。那么,我应该如何设置一个不受循环影响的变量?这就是代码:impor......
  • 编解码器无法解码位置 2-3 中的字节:截断的 \UXXXXXXXX 转义 (Python QREADER)
    我正在尝试pythonqreader模块,但每次我尝试运行它时,我都会收到SyntaxError:(unicodeerror)'unicodeescape'codeccan'tDecodebytesinposition2-3:truncated\UXXXXXXXXescapeerror.fromqreaderimportQReaderfromcv2importQRCodeDetector,imreadfrompyz......
  • Python 工程师对 3D 高斯溅射的介绍(第 1 部分)
    从Python工程师的角度理解和编写GaussianSplatting欢迎来到雲闪世界。2023年初,来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的3D高斯溅射”的论文。¹该论文展示了实时神经渲染的重大进步,超越了NeRF等先前方法的实用性。²......
  • 使用Python读取PDF文件,部分内容显示为一串乱码。我应该如何恢复它?
    使用Python读取PDF文件,部分内容显示为一串乱码。我该如何恢复它?importfitzdoc=fitz.open("2303.11366v4.pdf")#downloadfromhttps://arxiv.org/pdf/2303.11366print(doc[2].get_text().split('Figure1')[0])我得到了这样的文字:<RXDUHLQWKHPLGGOHRIDURRP>@7DVN......
  • Python 迭代列表
    分配sum_extra给定列表test_grades收到的额外学分总额。满分是100分,所以超过100分都是额外分。对于给定程序,sum_extra是8,因为1+0+7+0是8。给定程序的示例输出:额外总和:8请原谅我,我是编码新手,而且真的很糟糕!这是我的代码(不起作用)请......
  • 计算机毕业设计Python+Spark新能源汽车推荐系统 汽车大数据 汽车数据分析 汽车可视化
    表2黄河交通学院本科毕业设计(论文)开题报告学生姓名刘丹杰专业班级20本大数据一班学号2080910T01521设计(论文)题目基于Hadoop的新能源汽车销售数据分析系统的设计与实现选题的目的和意义:选题目的:新能源汽车销售数据分析系统的设计与实现旨在利用Hadoop等大数......
  • 为什么我的 python 程序一直说没有名为“PIL”的模块?
    我正在pythonIDLEshell中工作,由于某种原因pyautogui.locateOnScreen将无法工作。这是我的代码:frompyautoguiimport*importpyscreezeimportpyautoguiimporttimeimportkeyboardimportrandomimportwin32api,win32conwhile1:ifpyautogui.locateOnS......
  • 我在 Python 时间格式化函数中遇到代码问题
    我一直在研究一个Python函数,将给定的秒数转换为可读的时间格式(HH:MM:SS)。该函数对于大多数测试用例都能正常工作,但对于一些特定的输入会失败。这是我编写的函数:defmake_readable(seconds):ifseconds<60:s1=secondsh1,m1=(0,0)return......
  • 《流畅的Python》第二版 第11章
     fromarrayimportarrayimportmathclassVector2d:__match_args__=('x','y')typecode='d'def__init__(self,x,y):self.__x=float(x)self.__y=float(y)@propertydefx(self)......
  • 《流畅的Python》第二版 第12章
       fromarrayimportarrayimportmathimportfunctoolsimportitertoolsimportoperatorimportreprlibclassVector:typecode='d'def__init__(self,components):self._components=array(self.typecode,components)......