在python词典中操作值

时间:2014-12-31 18:38:27

标签: python python-3.x dictionary mean median

所以我已经从tsv文件中创建了这个词典,

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'])

maxgrade = max(grades,key=grades.get)


print(grades)
print(maxgrade) 

csv_f.close()

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

找到成绩最高的名字后

  1. 我不知道如何操纵这些值来找到所有等级高于班级均值的学生的名字。 (平均值是值的总和除以值的数量)。
  2. 我不知道如何找到班级的中位数。
  3. 所有成绩均高于中位数的学生的姓名。

3 个答案:

答案 0 :(得分:2)

  
      
  1. 我不知道如何操纵这些值来查找所有等级高于班级均值的学生的姓名。 (平均值是值之和除以值的总和)。
  2.   

您可以使用列表推导来创建符合条件的学生子列表:

above_mean = [(s,g) for s,g in grades.items() if g > mean]
  
      
  1. 我不知道如何找到班级的中位数。
  2.   

这比较棘手。对学生/成绩列表进行排序:

import operator
sorted_by_grade = sorted(grades.items(),key=operator.itemgetter(1))

然后找到中间值。如果列表的长度为奇数,则中间值索引为:

median_index = len(sorted_by_grade) // 2  # Python 3 syntax for integer division

如果列表的长度是偶数,则它是中间两个数字除以2的总和:

half = len(sorted_by_grade) // 2
median = (sorted_by_grade[half-1][1] + sorted_by_grade[half][1]) / 2 # Python 3 float division
  
      
  1. 所有成绩均高于中位数的学生的姓名。
  2.   

sorted_by_grade列表中使用列表推导,按大于中位数的等级筛选,类似于上面的理解值。

答案 1 :(得分:0)

要计算成绩中位数较高的名字,您可以这样做:

names=[ii for ii in grades.keys() if grades[ii] > median]

假设您计算了中位数,并且平均值相似。请查看this如何实现中位数。计算均值:

mean=float(sum(grades.values()))/len(grades)

答案 2 :(得分:0)

好的,把上面的所有答案都放在上面,这就是我所拥有的:

import csv
import operator

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'])

maxgrade = max(grades,key=grades.get)

mean = float(sum(grades.values()))/len(grades)

above_mean = [(student,grade) for student,grade in grades.items() if grade> mean]

sorted_by_grade = sorted(grades.items(),key = operator.itemgetter(1))

median_index = len(sorted_by_grade) // 2 

half = len(sorted_by_grade) // 2

median = (sorted_by_grade[half-1][1] + sorted_by_grade[half][1])/2

names = [ii for ii in grades.keys() if grades[ii]> median]

print(grades)

#print(maxgrade) 

#print(mean)

#print(sorted_by_grade)

#print(above_mean)

print(median)

print(names)

#print(len(grades))

csv_f.close()

感谢您的帮助!