You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python代码报TypeError:列表索引需为整数而非字符串,如何修复?

问题分析与修复方案

错误根源

你遇到的TypeError: list indices must be integers or slices, not str,确实是因为ballots[row[2]] = 1这行代码:你把ballots定义成了列表(list),列表只能用整数索引或切片访问,但你用了字符串(候选人名字)当索引,自然会报错。统计候选人得票应该用字典(dict),键存候选人姓名,值存对应票数。

具体修复步骤

  1. 修正ballots的初始类型
    把:

    ballots = []
    

    改成:

    ballots = {}
    
  2. 修复CSV读取的缩进错误
    原代码中for row in csvReader:写在了with open(...)块外面,文件已经关闭,根本读不到数据。要把循环缩进,放在csvHeader = next(csvFile)的下方,确保在文件打开状态下读取内容。

  3. 修正投票统计循环的变量名与逻辑错误

    • 原循环for ballots in candidates:里的变量名ballots和统计字典重名了,改成for candidate in candidates:。
    • votes = candidates.get(ballots)完全错误,应该从ballots字典中取对应候选人的票数,改成votes = ballots[candidate]。
    • 把voteOutput += ...的缩进放到循环内部,不然只会记录最后一个候选人的信息。
    • 输出模板里的{candidates}要改成{candidate},不然会打印整个候选人列表而非单个名字。
  4. 补充完整选举结果输出
    把生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:43:15