从csv创建字典

时间:2014-12-31 15:47:57

标签: python csv dictionary

我是新手,并且已经阅读了许多文章,但无法弄清楚这一点。我正在尝试从这个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'))

2 个答案:

答案 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))