数独验证:for循环报'int object is not iterable',列表推导式正常求因
数独验证代码:for循环报错与列表推导式的差异分析
错误原因解析
你写的for循环代码触发TypeError: 'int' object is not iterable的核心问题:
l是nlist中的子列表,l[0]是单个整数(数独格子里的数字)set()函数要求传入可迭代对象(比如列表、生成器),但整数本身不可迭代,直接把l[0]传入set()就会报错
而列表推导式里的l[0] for l in nlist是一个生成器表达式,它会遍历nlist的每个子列表,把所有l[0]的数值收集成可迭代序列后再传给set(),完全符合参数要求,因此不会报错。
逻辑差异对比
你的两段代码逻辑完全不一致:
- 原for循环逻辑:
每次遍历一个子列表,就把该子列表的第一个元素(单个整数)转成set,再判断这个set的长度是否等于nlist的长度。这既不符合你要的「检查所有子列表相同索引元素是否重复」的需求,还存在语法错误。 - 列表推导式逻辑:
先收集所有子列表的第一个元素,转成set后判断长度是否等于nlist的长度(set自动去重,长度相等说明所有元素无重复),这才是符合数独验证需求的逻辑。
修正后的for循环实现
如果想用for循环实现和列表推导式相同的逻辑,可以参考以下两种写法:
方式1:先收集所有元素再判断
first_column = [] for l in nlist: first_column.append(l[0]) if len(set(first_column)) != len(nlist): return False
方式2:遍历过程中实时查重(更高效)
seen = set() for l in nlist: num = l[0] if num in seen: return False seen.add(num) # 遍历完无重复则返回True return True
内容的提问来源于stack exchange,提问作者VV18
相关产品推荐
相关产品推荐

