从cs创建词典

2024-07-04 16:58:35 发布

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

我在这方面是新手,读了很多文章,但还是搞不懂。我正在尝试从这个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

我不知道如何把它们编入词典并返回成绩最高的学生的名字。到目前为止,我一直在努力:

^{2}$

Tags: 字典tsv文章fnamerobertalice新手brown
2条回答

您希望在您想要构建的字典中成为?你说得不太清楚。假设它是firstname, lastname2-items元组,例如:

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就是你要找的格言。寻找成绩最高的学生,例如:

^{pr2}$

不管怎样,我认为使用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)

输出:

^{pr2}$

找到成绩最高的学生有点困难,因为如果打成平手,可能不止一个。下面是如何处理的方法(注意:出于测试目的,我在文件中添加了另一个学生行):

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

相关问题 更多 >

    热门问题