如何让嵌套if逻辑持续循环,直到listup全部元素匹配listdown后弹出清空
问题原因
你当前代码提前终止的核心问题是用for循环遍历动态变化的列表:Python的for循环会基于第一次遍历的列表初始长度生成迭代器,你在循环过程中不断调用pop(0)缩短listup的长度,迭代器很快就走到了尽头,自然不会继续处理剩余元素。
解决方法
把外层的for循环替换为while循环,只要listup不为空就持续执行匹配逻辑即可,同时可以优化匹配逻辑,不需要写死只判断listdown[1],适配匹配项在listdown任意位置的场景:
listup = [{'post': 'up', 'address': 1, 'index': 1}, {'post': 'up', 'address': 1, 'index': 2}, {'post': 'up', 'address': 1, 'index': 3}, {'post': 'up', 'address': 1, 'index': 4}] listdown = [{'post': 'down', 'address': 1, 'index': 1}, {'post': 'down', 'address': 1, 'index': 3}, {'post': 'down', 'address': 1, 'index': 2}, {'post': 'down', 'address': 1, 'index': 4}] while len(listup) > 0: # 每次取listup的第一个元素作为匹配目标 target_index = listup[0]['index'] target_addr = listup[0]['address'] if listdown[0]['index'] == target_index and listdown[0]['address'] == target_addr: # 首位匹配,直接弹出两个列表的首位 print('1 >>', listup[0]) print('2 >>', listdown[0]) listup.pop(0) listdown.pop(0) print(True) else: # 首位不匹配,打印提示 print('1 >>', listup[0]) print('2 >>', listdown[0]) print('seen down earlier than it supposed to') print(False) # 遍历listdown找匹配项 for i in range(len(listdown)): if listdown[i]['index'] == target_index and listdown[i]['address'] == target_addr: print('11 >>', listup[0]) print('22 >>', listdown[i]) # 弹出匹配项和listup的首位 listup.pop(0) listdown.pop(i) print('---', True) break else: print('listup empty - finished')
运行结果
执行上述代码可以得到完整的匹配输出,最终listup会被完全清空:
1 >> {'post': 'up', 'address': 1, 'index': 1} 2 >> {'post': 'down', 'address': 1, 'index': 1} True 1 >> {'post': 'up', 'address': 1, 'index': 2} 2 >> {'post': 'down', 'address': 1, 'index': 3} seen down earlier than it supposed to False 11 >> {'post': 'up', 'address': 1, 'index': 2} 22 >> {'post': 'down', 'address': 1, 'index': 2} --- True 1 >> {'post': 'up', 'address': 1, 'index': 3} 2 >> {'post': 'down', 'address': 1, 'index': 3} True 1 >> {'post': 'up', 'address': 1, 'index': 4} 2 >> {'post': 'down', 'address': 1, 'index': 4} True listup empty - finished
内容的提问来源于stack exchange,提问作者Stack Vau
相关产品推荐
相关产品推荐

