Python输出列表237前的偶数时重复元素导致index判断错误如何解决
问题原因
你的代码出错的核心原因是Python列表的index()方法只会返回指定元素第一次出现的索引:当遍历到237之后的第二个566时,num_list.index(num)返回的是第一个566的索引,这个索引小于237的索引,所以会被误判为符合条件输出。
同时你原来的写法还有两个可优化的点:
- 每次循环都调用
num_list.index(237),会重复遍历列表多次,效率很低 - 逻辑上完全不需要提前计算索引,题目要求遇到237就停止打印,直接在遍历到237时终止循环即可
最优修改方案
直接贴合题目要求的逻辑写:遍历列表时,先判断当前元素是不是237,如果是直接终止循环,否则判断是不是偶数,符合条件就打印:
def even_numbers(num_list): for num in num_list: # 遇到237直接停止遍历 if num == 237: break # 是偶数就打印 if num % 2 == 0: print(num) even_numbers([386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958, 743, 527])
这个方案不会处理237之后的任何元素,完全避免了重复值的判断问题,效率也更高。
保留索引判断的修改方案
如果你非要保留索引判断的写法,可以提前算出237的索引,再用enumerate遍历同时拿到当前元素的真实索引,就不会出现重复值的误判问题:
def even_numbers(num_list): # 提前只算一次237的索引 stop_index = num_list.index(237) # 同时遍历索引和元素 for idx, num in enumerate(num_list): if num % 2 == 0 and idx < stop_index: print(num) even_numbers([386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958, 743, 527])
两种写法运行后都会输出正确结果,不会包含237之后的第二个566。
内容的提问来源于stack exchange,提问作者Khor Jia Wynn
相关产品推荐
相关产品推荐

