Python for循环遍历列表时无法移除所有字典元素的问题排查
问题原因
- 核心问题是遍历列表的同时直接修改原列表(执行删除操作),会导致迭代器索引错位。
以你代码里first键对应的列表为例,初始列表长度为3,索引0、1、2分别对应18岁、17岁、19岁的Harry字典:- 第一次迭代取索引0的18岁Harry,执行删除后列表元素自动前移,变为
[17岁Harry, 19岁Harry],长度为2 - 第二次迭代迭代器直接向后偏移到索引1位置,取到的是当前列表里的19岁Harry(对应原列表索引2的元素),删除后列表仅剩
[17岁Harry],长度为1 - 第三次迭代迭代器要取索引2位置的元素,但当前列表最大索引为0,循环直接终止,17岁的字典就被残留下来了
- 第一次迭代取索引0的18岁Harry,执行删除后列表元素自动前移,变为
- 额外说明:你代码里
data = test[key]和data_remove_from = test[key]是同一个列表对象的引用,不是独立副本,修改任意一个变量都会直接改动原字典存储的列表,写两个变量没有实际作用。
修复方案
如果只是要实现你复现代码里的清空列表效果,不要直接遍历正在修改的原列表,遍历列表的固定副本即可:
test = { "first" : [{"Name": "Harry", "Age": 18}, {"Name": "Harry", "Age": 17}, {"Name": "Harry", "Age": 19}] , "second" : [{"Name": "Harry", "Age": 20}, {"Name": "Harry", "Age": 15}, {"Name": "Harry", "Age": 11}]} print(test.keys()) for key in test.keys(): print(key) data = test[key] # 遍历列表的浅拷贝,遍历过程不受原列表删除操作的索引影响 for dict_test in data.copy(): data.remove(dict_test) print(data)
运行上述代码就能得到你预期的两个空列表输出。
如果你要实现最初的两个嵌套JSON对比需求,也遵循同样的原则:不要在遍历原列表时直接做删除操作,遍历固定副本逐个匹配即可。Python中字典可以直接用==判断内容是否完全一致,匹配到相同内容就从两边的剩余列表中移除,最后检查剩余列表是否为空就能判断对应键的值是否完全匹配,剩余内容就是差异部分,可以直接输出到控制台或写入文件。
内容的提问来源于stack exchange,提问作者Trusty_Investigator
相关产品推荐
相关产品推荐

