Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration

    # result 是一个字典, 把里面属性值是None的属性删除
    for key in result:
        if not result[key]:
            del result[key]
            continue  

但是报错信息如下

RuntimeError: dictionary changed size during iteration   # 字典在迭代的时候改变了字典大小 

python 遍历一个dict、set类型的同时,并且在改变这个变量的长度或者一边遍历一边修改,这时候就会抛出这错误;

我查了一些资料之后, 才发现用for in 迭代的时候是用迭代器的, (或许是个链表?), 不能在迭代的时候添加或删除属性, 只能更改属性值. (具体原理我也不太懂, 那么我先把问题解决了吧)

我想了想, 解决办法有两种, 一种是把字典转为列表, 然后再增删; 或者我不遍历字典, 只遍历字典的属性名, 那么就避开了这个问题.根据需要, 我选择了后面一种, 我是这么干的

这个问题在Python2和Python3中都会出现;

如下是针对python2和python3关于此类方法解决的思路:

# python2中遍历 dictVar.keys(),返回一个列表,从而得到一个列表,这样可以一边遍历列表一遍修改字典;

# 但是这个方法在python3中无法使用,因为这时候按照遍历 dictVar.keys(),返回一个迭代器而不再是一个列表,所以这个时候把字典作为参数放到list方法内,这样才能返回一个列表;

请看下图解决方法:

原文地址:https://www.cnblogs.com/JetpropelledSnake/p/9114206.html

时间: 2024-08-29 10:00:24

Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration的相关文章

python : dictionary changed size during iteration

1. 错误方式 #这里初始化一个dict >>> d = {'a':1, 'b':0, 'c':1, 'd':0} #本意是遍历dict,发现元素的值是0的话,就删掉 >>> for k in d: ... if d[k] == 0: ... del(d[k]) ... Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeE

python错误之RuntimeError: dictionary changed size during iteration

pythonn报错信息: C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/Administrator/PycharmProjects/pythondemo/maptest.pyTraceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/pythondemo/maptest.py

python 报错RuntimeError: dictionary changed size during iteration

1 a = {'1':11, '2':0, '3':0} 2 for b in list(a.keys()): 3 if a[b] == 0: 4 del a[b] 5 6 print(a) 报错是因为在字典迭代期间改变字典大小 我们可以通过取出字典的键值,在转化为列表,这样在for循环期间就可以删除了 原文地址:https://www.cnblogs.com/lonelyshy/p/9775717.html

python面试题目

问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1.x, Child2.x 答案是 1 1

Python面试题目--汇总

原文链接-https://github.com/taizilongxu/interview_python Python语言特性 1 Python的函数参数传递 2 Python中的元类(metaclass) 3 @staticmethod和@classmethod 4 类变量和实例变量 5 Python自省 6 字典推导式 7 Python中单下划线和双下划线 8 字符串格式化:%和.format 9 迭代器和生成器 10 *args and **kwargs 11 面向切面编程AOP和装饰器

selenium+python面试题目总结

1. WebDriver原理 webDriver是按照client/server模式设计,client就是我们的测试代码,发送请求,server就是打开的浏览器来打开client发出的请求并做出响应. 具体的工作流程: ·webdriver打开浏览器并绑定到指定端口.启动的浏览器作为remote server. ·client通过commandExecuter发送httpRequest给remote server的的侦听端口(the      webdriver wire control通信协议

Python import 同文件夹下的py文件的函数,pycharm报错

原因是:    pycharm不会将当前文件目录自动加入自己的sourse_path. 解决方案:右键make_directory as-->Sources Root将当前工作的文件夹加入source_path就OK了 原文地址:https://www.cnblogs.com/Bella2017/p/10859392.html

8个Python面试必考的题目,小编也被坑过 ToT

写在前面 小编学习Python已经三年多了,现在稳定在一家公司快一年了,回想起来一年以前的面试经历真的有点胆战心惊啊! 因为面试题目一不小心就会被坑啊~ 你经历过绝望么? 当你被Python面试题目坑到的时候内心真的一万个草泥马徘徊在心中啊o(╥﹏╥)o 下面小编就分享一些小编亲身经历过的一些Python神坑面试题哦~ 干货来了 1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list lis

巨蟒python全栈开发-第7天 基本数据类型补充&amp;深浅拷贝

1.基本数据类型补充 2.深浅拷贝 DAY5-基本数据类型(基本数据类型补充&深浅拷贝) 本节主要内容: 1 (1)#1.'''#字符串是不可变的数据类型lst=['alex','dsb','wusir','xsb']#大烧饼,小烧饼s='_'.join(lst) #使用前面的字符串,对后面的列表进行拼接,拼接的结果是一个字符串print(s)'''(2)'''#split() 根据你给的参数进行切割,切割的结果是列表 s='alex_dbs_wusir_xsb'lst=s.split("