繁体   English   中英

如何遍历 csv 文件并根据列表中的值创建列表?

[英]How do I loop through a csv file and create a list based on the values in the list?

我有一个包含三列(ID、县和候选人)的 csv 文件。 有四个候选人,我需要创建四个列表(每个候选人一个)。 每次候选人的名字出现在列表/列中时,我都想将该名字添加到新列表中,然后获取最后一个列表的长度,以查看他们获得了多少票。 当我运行脚本时,它成功打印了投票总数,但是每个候选人列表的长度都打印为“0”,所以我认为他们没有成功添加到列表中。

我对 python 相当陌生。 我相信我的错误在于我的循环方式和我的 if 语句。

谢谢你。

with open(poll_path, 'r') as csvfile:
    csvreader = csv.reader(csvfile, delimiter=',')

#skip the header
    next(csvreader,None)

python/
    votes = 0
    votes = []
    candidate_list = 0
    candidate_list = []
    khan = 'Khan'
    khan = []
    kahn = 0
    correy = "Correy"
    correy = []
    correy = 0
    li = "Li"
    li = []
    li = 0
    otooley = "O'Tooley"
    otooley = []
    otooley = 0
    for row in csvreader:
        votes_cast=str(row[0])
        votes.append(votes_cast)
        candidates=str(row[2])
        candidate_list.append(candidates)
        if row[2] == str(khan):
            khan.append(candidate_list)
            
        if row[2] == str(correy):
            correy.append(candidate_list)
            
        if row[2] == str(li):
            li.append(candidate_list)

        if row[2] == str(otooley):
            otooley.append(candidate_list)
            
    total_votes = len(votes)
    print("Election Results")
    print("----------------------------")
    print("Total Votes: " + str(total_votes))
    print("----------------------------")
    kahn_votes = len(khan)
    print(kahn_votes)
    correy_votes = len(correy)
    print(correy_votes)
    li_votes = len(li)
    print(li_votes)
    otooley_votes = len(otooley)
    print(otooley_votes)

你的代码有很多问题。 当您多次分配变量时,如

khan = 'Khan'
khan = []
kahn = 0

您不断丢失早期的值。 kahn0 ,字符串和列表都消失了。 前两行毫无意义。

votes_cast=str(row[0])

csv模块只创建字符串,不需要str

if row[2] == str(khan):

你知道khan0吗? 是的,这只是将第 2 行与字符串“0”进行比较,所以我失败了。 由于khan一开始就被认为是字符串,所以你也不应该施放它。

有一种更好的方法可以使用字典来跟踪候选计数。 代码的一般说明

  • 使用字典来跟踪候选计数
  • 不要明确使用默认值。 open("foo", "r") should be open("foo")
  • 不要硬编码候选人,只需使用文件中的内容
  • 将 csv 行解压缩为变量以提高可读性

编码

import csv

candidate_count = {}

with open(poll_path, newline=None) as csvfile:
    csvreader = csv.reader(csvfile)
    for ID, county, candidate in csvreader:
        if candidate not in candidate_count:
            candidate_count[candidate] = 0
        candidate_count[candidate] += 1

# we can sort by total counts to print
for candidate, votes in sorted(candidate_count.items(), key=lambda kv: kv[1]):
    print(candidate, votes)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM