移除字典中元素报RuntimeError: dictionary changed size during iteration 解决办法

题目:移除字典中元素报RuntimeError: dictionary changed size during iteration 解决办法

问题:过滤一段话中单词出现的次数。

#将出现大于1次以上的单词从字典中移除    
result_dict = {'FIGURE': 2, '1': 2, 'SHOWS': 1, 'THE': 3, 'RELATIONSHIP': 1, 'BETWEEN': 2, '2': 1}  
print(f"移除前:{result_dict}")
"""
for key in result_dict:
    if result_dict[key] > 1:
        del result_dict[key]     #此段代码移除后报错,考虑其原因是由于移除导致位置发生该变 \
                                 builtins.RuntimeError: dictionary changed size during iteration  
"""
remove_list = [key for key in result_dict if result_dict[key] > 1]  #用一个列表接收带移除的键
for key1 in remove_list:
    del result_dict[key1]
print(f"移除后:{result_dict}")

考虑移除字典中的元素位置会发生变化,导致报错,想到列表中元素的移除也会出现因为位置变化,于是做了个实验,发现列表的移除也会出现类似问题,具体解决办法见下文。
方法1
**

#修改前
#移除列表中不是字符串的元素
list_3 = ["abc","2",2,4.4,"4.4","",99,"abcd",666,"777","444.4",444.4]
[list_3.remove(i) for i in list_3 if 'str' not in str(type(i))]  
print(list_3)  #['abc', '2', 4.4, '4.4', '', 'abcd', '777', '444.4']
#分析原因:由于移除列表中的元素,导致列表中元素的位置发生改变,从而引起有的元素未按题意中移除
#修改后
list_3 = ["abc","2",2,4.4,"4.4","",99,"abcd",666,"777","444.4",444.4]
i = 0
while i < len(list_3):
    if not isinstance(list_3[i],str):
        list_3.remove(list_3[i])
        i = i
    else:
        i = i+1
print(list_3)  #['abc', '2', '4.4', '', 'abcd', '777', '444.4']

方法2:用另一个列表接受要移除的数据,然后在遍历移除

list_3 = ["abc","2",2,4.4,"4.4","",99,"abcd",666,"777","444.4",444.4]
remove_list = [k for k in list_3 if not isinstance(k,str)]
result_list = [list_3.remove(j) for j in remove_list]
print(list_3)  #['abc', '2', '4.4', '', 'abcd', '777', '444.4']

纸上得来终觉浅,绝知此事要躬行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值