如何让连续for循环遍历字典时从上一次终止位置继续执行,实现列表遍历同等效果
字典断点遍历的实现方案
报错原因
- 原代码中
dic_data.values()返回的是字典所有值的视图对象,无法直接与整数25做大小比较,会触发类型错误 - 字典没有和列表对应的数字下标索引,通过
range(len(dic_data))生成的索引无法对应到字典的元素位置
方案1:键值对转列表实现(易兼容原有逻辑)
Python 3.7及以上版本默认保留字典的插入顺序,将字典的键值对转为列表后,即可完全复用列表的遍历逻辑:
dic_data = {1: 10, 3: 20, 6: 15, 8: 25, 11: 17, 12: 23, 14: 24, 15: 45, 17: 22, 19: 20} # 转成(键, 值)的有序列表 dic_items = list(dic_data.items()) pos_1 = 0 pos_2 = 0 # 找第一个符合条件的元素 for i in range(len(dic_items)): k, v = dic_items[i] if v >= 25: pos_1 = i key_1 = k break print(f"第一个值≥25的键为: {key_1}, 所在遍历位置为: {pos_1}") # 从pos_1+1开始找第二个符合条件的元素 for i in range(pos_1+1, len(dic_items)): k, v = dic_items[i] if v >= 25: pos_2 = i key_2 = k break print(f"第二个值≥25的键为: {key_2}, 所在遍历位置为: {pos_2}")
运行结果:
第一个值≥25的键为: 8, 所在遍历位置为: 3 第二个值≥25的键为: 15, 所在遍历位置为: 7
方案2:迭代器实现(低内存占用)
如果字典数据量较大,转列表会产生额外内存开销,可以使用迭代器自动记住遍历位置,无需存储全量列表:
dic_data = {1: 10, 3: 20, 6: 15, 8: 25, 11: 17, 12: 23, 14: 24, 15: 45, 17: 22, 19: 20} # 生成字典键值对的迭代器 item_iter = iter(dic_data.items()) key_1 = None # 找第一个符合条件的元素 for idx, (k, v) in enumerate(item_iter): if v >=25: key_1 = k pos_1 = idx break print(f"第一个值≥25的键为: {key_1}, 所在遍历位置为: {pos_1}") # 迭代器会自动从上次终止的位置继续遍历 key_2 = None for offset, (k, v) in enumerate(item_iter): if v >=25: key_2 = k pos_2 = pos_1 + 1 + offset break print(f"第二个值≥25的键为: {key_2}, 所在遍历位置为: {pos_2}")
运行结果与方案1完全一致。
内容的提问来源于stack exchange,提问作者Junior
相关产品推荐
相关产品推荐

