迭代器生成元素时如何正确检查相等性?解决末尾元素判断失效问题
问题根源
你最后一组元素的判断逻辑没执行到!原来的代码里,if previous_item == current_item是在循环处理每个next_item的时候触发的,但最后一对元素(3和3)是在循环结束后单独yield的,这时候完全跳过了判断步骤,所以flag一直是默认的'none'。
修复方案
只需要在循环结束后,额外加一次判断就行,修改后的代码如下:
def test(current): iterator = iter(current) previous_item = None current_item = next(iterator) flag = 'none' for next_item in iterator: if previous_item == current_item: flag = 'here' yield previous_item, current_item, next_item, flag flag = 'none' previous_item = current_item current_item = next_item # 新增:检查最后一对元素是否相等 if previous_item == current_item: flag = 'here' yield (previous_item, current_item, None, flag) if __name__ == "__main__": l = [0, 1, 2, 3, 3] for prev, curr, nex, flag in test(l): print(prev, curr, nex, flag)
效果验证
运行后输出完全符合你的期望:
None 0 1 none 0 1 2 none 1 2 3 none 2 3 3 none 3 3 None here
逻辑说明
- 循环内的逻辑负责处理所有带有
next_item的三元组,每次yield前都会检查前两个元素是否相等; - 循环结束后,剩下的最后一对元素没有
next_item,所以单独做一次判断,再yield出去,这样就不会漏掉最后一组的检查了。
内容的提问来源于stack exchange,提问作者iich
相关产品推荐
相关产品推荐

