有没有办法循环列表并将所有内容转换为整数?

时间:2014-02-01 04:00:47

标签: python python-3.x

我正在编写一个程序来计算成绩列表中的平均值并将其与学生的名字一起打印出来,但是当我尝试将所有成绩加总并将它们除以时,我遇到类型错误列表的长度。这就是我所拥有的:

def average_grade(afile):
    aline = afile.readline()
    grades = []
    while aline:
        info = aline.split()
        grades = info[1:]
        average = sum(grades) / len(grades)
        print(info[0],average)
        aline = afile.readline()

my_file = open('studentdata.txt','r')

average_grade(my_file)

my_file.close()

这是文件的内容:

joe 10 15 20 30 40
bill 23 16 19 22
sue 8 22 17 14 32 17 24 21 2 9 11 17
grace 12 28 21 45 26 10
john 14 32 25 16 89

这是我收到的错误消息:

Traceback (most recent call last):
  File "averagegrade.py", line 13, in <module>
    average_grade(my_file)
  File "averagegrade.py", line 7, in average_grade
    average = sum(grades) / len(grades)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

是否可以使用列表遍历将grades中的所有内容转换为整数,还是必须再写几行?

3 个答案:

答案 0 :(得分:6)

问题是您将数字作为字符串读取,必须先将它们转换为int s才能添加它们:

grades = [int(x) for x in info[1:]]
average = sum(grades) / len(grades)

答案 1 :(得分:4)

是。使用map

在您的代码中,您只需使用:

average = sum(map(int, grades)) / len(grades)

答案 2 :(得分:0)

正如其他人所提到的那样,当你从文件中读取文件时,无论文件中是否有实际数字,你都可以获得字符串。

这是一个清理版本,它更像Python(需要Python 3):

import fileinput

def average_grades():
    for line in fileinput.input():
        name, *grades = line.split()
        grades = [int(grade) for grade in grades]
        average = sum(grades) / len(grades)
        yield name, average

if __name__ == '__main__':
    avgs = ("{} {:.2f}".format(name, avg) for name, avg in average_grades())
    print(*avgs, sep='\n')

通过这种方式,您可以使用studentdata文件作为参数调用脚本:

python3 avg.py studentdata.txt