我是新手,并且已经阅读了许多文章,但无法弄清楚这一点。我正在尝试从这个tsv文件创建一个字典:
fname lname marks
Alice Brown 8.5
Francine Walters 9
Robert Wilson 7
Evelyn Stewart 10
Margo Kazinsky 9.5
Gordon Rogers 8.5
Stephanie Hoover 9
Roger Brosnan 8.7
Francine Williamson 9
Leonard Runka 8
Rosalind Samuelson 6.5
Sasha Levchenko 8
Anastasia Melnyk 8.5
Charlie Watson 8
我不知道如何将它们变成字典并返回最高等级的学生的姓名。这是我到目前为止所尝试的:
import csv
f = open('grades.tsv')
grades= []
csv_f = csv.reader(f, delimiter = ',')
for line in csv_f:
print(line[0])
grades.append(line[0])
f.close()
print(sorted(grades[2]))
print(len(grades))
print(grades)
print(type(line[0]))
print(grades.strip('\t'))
答案 0 :(得分:3)
对于它的价值,我认为使用csv.DictReader
会更容易一些:
import csv
grades = {}
with open('grades.tsv', newline='') as csv_f:
for row in csv.DictReader(csv_f, delimiter='\t'):
fullname = row['fname'] + ' ' + row['lname']
grades[fullname] = float(row['marks'])
print(grades)
输出:
{'Sasha Levchenko': 8.0, 'Charlie Watson': 8.0, 'Marie Curie': 10.0,
'Margo Kazinsky': 9.5, 'Alice Brown': 8.5, 'Stephanie Hoover': 9.0,
'Rosalind Samuelson': 6.5, 'Gordon Rogers': 8.5, 'Anastasia Melnyk': 8.5,
'Evelyn Stewart': 10.0, 'Francine Walters': 9.0, 'Leonard Runka': 8.0,
'Robert Wilson': 7.0, 'Roger Brosnan': 8.7, 'Francine Williamson': 9.0}
找到成绩最高的学生有点棘手,因为如果有平局,可以有不止一个。以下是如何处理(注意:出于测试目的,我在文件中添加了另一个学生行):
Marie Curie 10
以下代码行:
highest_grade = max(grades.values())
print('highest_grade: {}'.format(highest_grade))
tie = list(grades.values()).count(highest_grade) > 1
print('student{} with highest grade:'.format('s' if tie else ''))
for student, grade in sorted(grades.items(), key=
lambda s: s[0].split()[::-1]): # Sort by lname
if grade == highest_grade:
print(' ', student)
获得以下输出:
highest_grade: 10.0
students with highest grade:
Marie Curie
Evelyn Stewart
答案 1 :(得分:2)
您希望构建的词典中的键是什么?你没有说清楚。假设它是firstname, lastname
2项元组,例如:
with open('grades.tsv') as f:
# assuming the first row is "headers", let's skip it
next(f)
r = csv.reader(f, delimiter='\t')
d = dict(((first, last), float(grade))
for first, last, grade in r)
当然,您需要确保正确的分隔符:" tsv"似乎暗示分隔符是一个标签,你显示的数据外观也是如此,但是你明确强制它用逗号(我在这个例子中使用tab,但是,请确保你带查看文件的内容并选择正确的内容。)
此外,根据对OP的答案(以及Q中显示的数据)的评论,似乎文件的第一行可能只是标题,而不是数据;所以,我已经添加了next(f)
来跳过它(如果文件实际上全部由实际数据组成,没有标题行,则删除它。)
现在d
是您寻求的咒语。寻找成绩最高的学生,例如:
top_student = max(d, key=d.get)
print(' '.join(top_student))