嵌套在while循环中的Python for循环无法执行求助
问题分析与解决方案
嘿,我一眼就看出问题出在哪啦!你的核心问题是csv.reader返回的是一个迭代器,而迭代器有个关键特性:只能被遍历一次!
你看,代码里第一次的for c, row in enumerate(reader):已经把整个CSV文件的内容都读完了,迭代器内部的指针直接走到了末尾。当你在while循环里再次尝试遍历reader时,它已经没有任何数据可以返回了,所以那个for循环自然就不会执行。
具体修复步骤
1. 先把所有行存入列表复用
在第一次遍历之前,把reader转换成列表保存起来,这样就能重复遍历数据了:
import csv # 别忘了导入csv模块哦 with open("Nominees_18.csv") as nominees: reader = csv.reader(nominees) next(reader) # 跳过表头行 # 把所有行存入列表,后续可以反复遍历 rows = list(reader) # 第一次遍历用保存好的rows列表 for c, row in enumerate(rows): print(row[0], row[1], c) while True: name = input("Choose a number: ") print(4) # 这里遍历我们提前存好的rows列表,而不是已耗尽的reader for c, row in enumerate(rows): print(4) if str(c) == name: # 改成精确匹配,避免输入"1"匹配到c=11、21这类情况 # 修复你的统计逻辑:直接统计row中等于"y"的元素数量 print(sum(1 for item in row if item == "y")) # 修复判断逻辑,原来的写法只会匹配小写"no",用lower()兼容大小写输入 if input("Choose another? ").lower() == "no": break
2. 顺便修正两个小坑
- 原来的
str(c) in name逻辑有问题,会导致输入"1"时意外匹配到c=11、21等序号,改成str(c) == name实现精确匹配更合理。 - 你的列表推导式
len([i for i in row if row[i] == "y"])是错误的:i是row里的元素而非索引,直接遍历元素统计即可,用sum(1 for item in row if item == "y")更高效简洁。 input("chose another?") == ("no" or "No")的写法不严谨,("no" or "No")等价于"no",永远只会匹配小写输入,改成.lower() == "no"能兼容大小写的"no"或"No"。
这样修改后,while循环里的for循环就能正常执行啦!
内容的提问来源于stack exchange,提问作者user9410913
相关产品推荐
相关产品推荐

