Python3列表推导式代码输出异常求排查:结果不符预期
问题解决:过滤元素和不等于n的三元组
问题概述
我用Python列表推导式编写代码时遇到两个问题:一是运行时出现不应存在的[1,1,0]列表;二是输入为1、1、1、2时,输出缺失元素,和预期结果不符。调整循环范围、修改判断符号(==改!=)、替换remove为append后仍有其他错误。需求是:输入四个整数x、y、z、n(每行一个),输出所有元素和不等于n的三元组,结果按字典序升序排列。
原代码
if __name__ == '__main__': a = int(input()) b = int(input()) c = int(input()) n = int(input()) list1=[[x,y,z] for x in range(a+1) for y in range(b+1) for z in range(c+1)] for i in list1: if sum(i)== n: list1.remove(i) print(list1)
测试样本
输入:
1
1
1
2
实际输出:[[0, 0, 0], [0, 1, 0], [1, 0, 0]]
预期输出:[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
问题根源
遍历列表时直接调用remove()修改原列表会打乱迭代器的遍历顺序:当移除一个元素后,列表长度缩短,后续元素的索引会前移,导致迭代器跳过部分元素,最终要么漏删符合条件的项,要么误保留不该有的项。
修正方案
直接在列表推导式中完成过滤,避免后续修改原列表。这种方式不仅简洁,而且因为range()是升序遍历,生成的三元组天然符合字典序要求,无需额外排序。
修正后的代码:
if __name__ == '__main__': a = int(input()) b = int(input()) c = int(input()) n = int(input()) result = [[x, y, z] for x in range(a+1) for y in range(b+1) for z in range(c+1) if sum([x, y, z]) != n] print(result)
说明
- 列表推导式中直接加入
if sum([x,y,z]) != n的条件,只保留符合要求的三元组,一步到位。 - x、y、z按从小到大的顺序遍历,生成的列表天然满足字典序升序的要求,无需额外调用
sort()。
内容的提问来源于stack exchange,提问作者Kashvi
相关产品推荐
相关产品推荐

