如何避免RuntimeError: dictionary changed size during iteration或不使用.pop()实现需求
解决字典遍历修改引发的RuntimeError问题
问题原因
在遍历字典的同时使用pop()删除键,会改变字典的长度和结构,Python会因此抛出RuntimeError——因为遍历过程中不允许修改字典的大小。
方法一:遍历字典键的副本(保留pop())
通过将字典的键转换为列表(生成一个独立副本),遍历这个副本时,原字典的修改不会影响遍历流程,从而避免错误:
flavors = {"cinnamon": 4, "pumpkin": 2.5, "apple pie": 3} print("New flavors:") print(flavors) for i in flavors: if flavors[i] >= 3: flavors[i] = True else: flavors[i] = False print("Results:") print(flavors) # 遍历键的副本,避免遍历过程中修改原字典结构 for i in list(flavors.keys()): if flavors[i] == False: flavors.pop(i) print("Release:") print(flavors.keys())
方法二:不使用pop(),直接生成新结果集
更简洁高效的方式是通过推导式直接筛选符合条件的口味,无需修改原字典:
flavors = {"cinnamon": 4, "pumpkin": 2.5, "apple pie": 3} print("New flavors:") print(flavors) # 生成只包含获胜口味的新字典 winning_flavors = {flavor: score for flavor, score in flavors.items() if score >= 3} print("Release (dict):") print(winning_flavors.keys()) # 直接生成获胜口味的列表 winning_flavor_list = [flavor for flavor, score in flavors.items() if score >= 3] print("Release (list):") print(winning_flavor_list)
这种方式还能省去将评分转换为True/False的步骤,直接基于原始评分筛选,代码更精简。
内容的提问来源于stack exchange,提问作者Vladlena Malenkova
相关产品推荐
相关产品推荐

