从列表筛选奇偶数字至独立列表的代码迭代异常求助
列表奇偶筛选代码的问题分析与修复
问题根源
- 遍历中修改原列表导致迭代中断:第二个循环
for x in nums时,你用nums.pop()直接删除列表元素,遍历的列表长度在不断缩短,迭代器会提前终止。比如5个元素的列表,迭代到第3次时列表只剩2个元素,循环直接停了,所以只执行3次迭代。 - 逻辑对应完全错误:你判断的是
nums.pop()取出的y的奇偶性,但往奇偶列表里添加的却是当前迭代的x,这俩根本不是同一个数,完全搞混了判断和存储的对象。 - 顺序混乱:
pop()默认取列表最后一个元素,相当于从后往前处理数据,自然打乱了原输入顺序。
修复后的代码(最优解)
直接遍历原列表,不修改它,逻辑清晰且效率高:
nums = [] even = [] odd = [] for i in range(5): num = int(input('Give me a number: ')) nums.append(num) # 遍历原列表,逐个判断奇偶并分类存储 for num in nums: if num % 2 == 0: even.append(num) else: odd.append(num) print('奇数列表:', odd, '偶数列表:', even)
输入1-5的测试用例时,会输出:奇数列表: [1, 3, 5] 偶数列表: [2, 4],完全符合预期。
可选方案(若非要用pop操作)
如果一定要通过pop来处理,可以遍历原列表的副本,避免迭代时修改原列表:
nums = [] even = [] odd = [] for i in range(5): num = int(input('Give me a number: ')) nums.append(num) # 遍历nums的副本,原列表用来执行pop操作 for _ in nums.copy(): y = nums.pop() if y % 2 == 0: even.append(y) else: odd.append(y) # 注意:pop默认从末尾取数,结果顺序会反转,若要保持原顺序可改用pop(0),但效率较低 print('奇数列表:', odd, '偶数列表:', even)
内容的提问来源于stack exchange,提问作者Adarsh T Saji
相关产品推荐
相关产品推荐

