Python 如何使代码在列表中查找名称而不是数字?

Python 如何使代码在列表中查找名称而不是数字?,python,file,python-3.7,Python,File,Python 3.7,我有一个名为classgrades.txt的文件,其中包含来自示例类的学生数据。文件中的每一行由学生的姓氏、空格和一系列整数(用空格分隔)组成,这些整数代表作业的分数 我正试图编写一个Python程序,从这个文件中读取数据,并编写一个名为classscores.txt的新文件。classscores.txt的每一行应该包括学生的姓氏和他们在作业中的平均分数,四舍五入到最接近的整数 我试图找到一种方法,使用列表的长度来遍历它,一旦它到达一个名称,它就会停止并获取前面所有的数字,找到平均值并将其放在

我有一个名为classgrades.txt的文件,其中包含来自示例类的学生数据。文件中的每一行由学生的姓氏、空格和一系列整数(用空格分隔)组成,这些整数代表作业的分数

我正试图编写一个Python程序,从这个文件中读取数据,并编写一个名为classscores.txt的新文件。classscores.txt的每一行应该包括学生的姓氏和他们在作业中的平均分数,四舍五入到最接近的整数

我试图找到一种方法,使用列表的长度来遍历它,一旦它到达一个名称,它就会停止并获取前面所有的数字,找到平均值并将其放在名称旁边

infle=open('classgrades.txt','r')
行=infle.read()
outFile=open('classcores.txt','w')
修复列表=行。替换('\n','')
新建列表=修复列表。拆分(“”)
长度列表=长度(新列表)-1
以下是我的当前列表在执行此代码后的外观:

['Chapman','90','100','85','66','80','55','Cleese','80','90','85','88','Gilliam','78','82','80','80','75','77','Idle','91','Jones','68','90','22','100','0','80','85','Palin 80','90','


它应该在classscores.txt中很好地输出所有内容,类似这样的东西可以工作:

for i in range(0, len(new_list) - 1):
    if new_list[i][0].isalpha(): # Checks if first character in current item is a letter (found a name)
        num_of_scores = 0
        avg = 0
        for item in new_list[i + 1:len(new_list) - 1]: # Iterates through next item onward (getting the scores)
            if item[0].isnumeric():
                avg += int(item) 
                num_of_scores += 1
            else:
                break
        avg = int(avg / num_of_scores) # int() produces same effect as rounding down - cuts off decimals
        outFile.write(new_list[i] + ' ' + str(avg) + '\n')
outFile.close()

逻辑变得有点奇怪,因为似乎每个学生都有不同数量的答案,但它使用的是样本数据。

由于我们的文件已经将每个学生放在不同的行上,我们可以利用这一点,轻松地将他们按每个
\n
分开。或者更好地使用内置的
str.splitlines()
方法

从数学导入楼层
从统计数据看进口意味着什么
infle=open('classgrades.txt','r')
outFile=open('classcores.txt','w')
lines=infle.read().splitlines()
学生=[line.split(“”)表示行中的行]
分数=[]
对于学生中的学生:
姓名,*年级=学生
等级_as_ints=[int(等级)表示等级中的等级]
分数=最低分数(平均分)
分数。追加(名称+“”+str(分数)+“\n”)
输出文件写入线(分数)
考虑到输入文件的每一行都包含名称和分数,我会使用标准方法,将文本文件猛击到列表列表中(而不是普通列表)。这将使一切变得更容易

解决办法是:

with open('classgrades.txt','r') as f:
    # let Python split by line
    lines = f.readlines()

results = [] # we will put the results as a list of (name, average_grade) 
for line in lines:
    items = line.strip().split(' ')
    name = items[0]
    # grades are the rest:
    grades = items[1:]
    grades = [int(item) for item in grades] # convert to int
    avg_grade = sum(grades) / len(grades)
    # add the result of that student to the list:
    results.append((name, avg_grade)) 

with open('classcores.txt', 'w') as f:
    for result in results:
        f.write("%s %s\n" % result)

示例输出中Monty Python名称引用的道具!你能分享一份输入文件的副本吗(或者至少分享几行的样本?)。您已经很好地描述了它,但是如果我们有一个示例可以使用,那么编写代码就更容易了。我想这会被卡住,因为你的
成绩仍然是
str
s。另外,请注意(令人困惑的是)
readlines()
不会从每行末尾删除尾随的
\n
。我每次使用它都要检查它的行为。。。谢谢(我没有测试,因为我没有源文件)。这两个问题都很容易解决:对于行,只需使用
strip()
删除尾部的
\n
。还应将等级列表转换为整数。源代码已经被相应地修复了。是的,我有一个优势,就是在我写我的答案时,根据OP的描述和样本输出重建了文件!