我在学习计数和排序。我对这个任务有一个问题:
一些人参加数学竞赛。获胜者是达到最大分数的人(获胜者按每个等级分配)。找到每个等级达到的最大点数的值。每个年级有一人或更多人参加
输入
关于文件中所有参与者的信息(例如,‘input.txt’),其中每一行都应该具有这样的结构: family_name名称等级结果
姓氏和姓名应写成字符串,成绩范围在10到12之间,成绩(分数)在0到100之间。
输出
打印三个数字:10年级、11年级和12年级获胜者的分数。内部文件应该是这样写的:
open('input.txt','r',encoding='utf8')
我已经解决了这个任务,但是我没有使用计数排序。下面是完整的代码
def listAverage(list):
sum = 0
for i in list:
sum += i
return sum / len(list)
classes = []
inFile = open('input.txt', 'r', encoding='utf-8')
for line in inFile:
grade, mark = line.split()[2:]
if grade in classes:
classes[grade].append(int(mark))
else:
classes[grade] = [int(mark)]
for i in range(10, 13):
print(listAverage(classes[str(i)]), end=' ')
发布于 2019-05-29 21:52:49
以下是一些观察结果:
list
,而应该使用num_list
或类似的名称。)来避免忘记关闭文件。我建议使用一个较短的版本,即calculate
sum(num_list) / len(num_list)
(如果列表为空则产生错误;另请参阅list以下是代码的修改版本,用于解决一些问题;我还包含了一些建议(例如collections.defaultdict
)。
也许这对你有帮助(也可能没有)。
import collections
marks_per_grade = collections.defaultdict(list)
with open('input.txt', 'r', encoding='utf-8') as f:
for line in f:
line = line.strip() # remove newline from the end of the line
if len(line) > 0: # assure that the line is not empty
last_name, first_name, grade, mark = line.split()
# because it is a 'collections.defaultdict', if the grade does not
# yet exist, then it will add it with an empty list as initial value
marks_per_grade[int(grade)].append(int(mark))
for grade, mark_list in sorted(marks_per_grade.items()):
# this will raise error if the list is empty
avg_mark = sum(mark_list) / len(mark_list)
print(
'{:3d} {:3d} {:5.1f} {}'.format(
grade,
max(mark_list),
avg_mark,
mark_list))
发布于 2019-06-02 20:46:44
data = {10: [], 11: [], 12: []}
xxx = open('input.txt', 'r', encoding='utf8')
with xxx as file:
for lines in file:
line = lines.strip()
firstName, name, grade, mark = line.split()
data[int(grade)].append(int(mark))
print(data)
for grade in data:
print(sum(data[grade])/len(data[grade]))
https://stackoverflow.com/questions/56360255
复制相似问题