需要帮助理解为什么此值保持为1吗?Python CSV

2024-09-27 21:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

所以这段代码应该打开csv文件,从第1-3列(不是0)中获取值。一旦它得到了每一行及其3列的值,它就应该把这些值相加,然后除以3。我认为这段代码可以工作,但是在每一行中添加3列似乎不起作用。如果有人能告诉我为什么以及如何解决这个问题,那就太好了,谢谢。我很确定问题出在for index, summedValue in enumerate (sums):特别是“summedValue”值

if order ==("average score"):
    askclass = str(input("what class?"))
    if askclass == ('1'):
            with open("Class1.csv") as f:
                columns = f.readline().strip().split(" ")
                sums = [1] * len(columns)

                for line in f:
                    # Skip empty lines
                    if not line.strip():
                         continue

                    values = line.split(" ")
                    for i in range(1,len(values)):
                        sums[i] += int(values[i])

                for index, summedValues in enumerate (sums):    
                  print (columns[index], 1.0 * (summedValues) / 3)

Tags: columnscsv代码inforindexifline
2条回答
from statistics import mean
import csv

with open("Class1.csv") as f:
    # create reader object
    r = csv.reader(f)
    # skip headers
    headers = next(r)
    # exract name from row and use statistics.mean to average from row[1..
    # mapping scores to ints
    avgs = ((row[0], mean(map(int, row[1:]))) for row in r)
    # unpack name and average and print
    for name, avg in avgs:
        print(name,avg)

除非你已经写了空行到你的csv文件将不会有任何,不知道如何头适合它,但你可以使用它,如果必要的

您还可以使用python3中的*语法进行解包,我认为这样更好:

avgs = ((name, mean(map(int, row))) for name, *row in r)
for name, avg in avgs:
    print(name,avg)

要排序,请使用reverse=True按平均值排序,然后从最高到最低排序:

from statistics import mean
import csv
from operator import itemgetter

with open("Class1.csv") as f:
    r = csv.reader(f)
    avgs = sorted(((name, mean(map(int, row))) for name, *row in r),key=itemgetter(1),reverse=True)
    for name, avg in avgs:
        print(name,avg)

传递key=itemgetter(1)意味着我们按第二个子元素排序,第二个子元素是每个元组的平均值

使用

1, 2, 3
4, 2, 3
4, 5, 3
1, 6, 3
1, 6, 6
6, 2, 3

作为Class1.csv 以及

askclass = str(input("what class?"))
if askclass == ('1'):
  with open("Class1.csv") as f:
    columns = f.readline().strip().split(",")
    sums = [1] * len(columns)
    for line in f:
      # Skip empty lines
      if not line.strip():
        continue
      values = line.split(",")
      for i in range(1,len(values)):
        sums[i] += int(values[i])
for index, summedValues in enumerate (sums): 
  print (columns[index], 1.0 * (summedValues) / 3)

我得到了预期的结果:

what class?1
('1', 0.3333333333333333)
(' 2', 7.333333333333333)
(' 3', 6.333333333333333)

[更新]观察:

  1. 定义在sums = [1] * len(columns)上的sum有长度列,但您忽略了操作中的第一列,因此sum[0]的值始终是1,似乎没有必要
  2. 对于浮点数除法来说,summedValues / 3.0而不是1.0 * (summedValues) / 3就足够了

也许这就是你想要的

for line in f:
    # Skip empty lines
    if not line.strip():
         continue

    values = line.split(" ")
    for i in range(1,len(values)):
        sums[i] += int(values[i])

for index, summedValues in enumerate (sums):    
  print (columns[index], 1.0 * (summedValues) / 3)

相关问题 更多 >

    热门问题