Python代码报TypeError:列表索引需为整数而非字符串,如何修复?
问题分析与修复方案
错误根源
你遇到的TypeError: list indices must be integers or slices, not str,确实是因为ballots[row[2]] = 1这行代码:你把ballots定义成了列表(list),列表只能用整数索引或切片访问,但你用了字符串(候选人名字)当索引,自然会报错。统计候选人得票应该用字典(dict),键存候选人姓名,值存对应票数。
具体修复步骤
修正
ballots的初始类型
把:ballots = []改成:
ballots = {}修复CSV读取的缩进错误
原代码中for row in csvReader:写在了with open(...)块外面,文件已经关闭,根本读不到数据。要把循环缩进,放在csvHeader = next(csvFile)的下方,确保在文件打开状态下读取内容。修正投票统计循环的变量名与逻辑错误
- 原循环
for ballots in candidates:里的变量名ballots和统计字典重名了,改成for candidate in candidates:。 votes = candidates.get(ballots)完全错误,应该从ballots字典中取对应候选人的票数,改成votes = ballots[candidate]。- 把
voteOutput += ...的缩进放到循环内部,不然只会记录最后一个候选人的信息。 - 输出模板里的
{candidates}要改成{candidate},不然会打印整个候选人列表而非单个名字。
- 原循环
补充完整选举结果输出
把生成的voteOutput整合到最终的data变量里,还要找出得票最多的候选人,补充到结果中。
修复后的完整代码
import csv import os main_csv = os.path.join("..", "Pypoll", "Resources", "election_data.csv") dataFile = os.path.join("BallotAnalysis.txt") totalBallots = 0 candidates = [] ballots = {} # 改成字典 with open(main_csv) as csvFile: csvReader = csv.reader(csvFile, delimiter=",") csvHeader = next(csvFile) # 跳过表头 # 缩进进来,确保在文件打开状态下读取 for row in csvReader: totalBallots += 1 candidate_name = row[2] if candidate_name not in candidates: candidates.append(candidate_name) ballots[candidate_name] = 1 else: ballots[candidate_name] += 1 voteOutput = "" for candidate in candidates: # 变量名改为candidate,避免重名 votes = ballots[candidate] # 从字典中取票数 votePCT = (float(votes) / float(totalBallots)) * 100.00 # 缩进进来,每个候选人都追加到输出 voteOutput += f"\t{candidate}: {votePCT:.2f}% ({votes})\n" # 找出得票最多的候选人 winner = max(ballots, key=ballots.get) # 整合完整结果 data = ( f"\nElection Results\n" f"_____________________________________\n" f"\tTotal Votes: {totalBallots}\n" f"_____________________________________\n" f"{voteOutput}" f"_____________________________________\n" f"\tWinner: {winner}\n" ) print(data) with open(dataFile, "w") as textFile: textFile.write(data)
内容的提问来源于stack exchange,提问作者Mr Dragan
相关产品推荐
相关产品推荐

