题目:移除字典中元素报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']