我如何在词典中使用键

时间:2013-12-08 22:37:17

标签: python algorithm list dictionary key

Hello stackoverflow用户! 假设我有一本字典

ID = {'1130327': ['Starr, Ringo', '1130327', '10/20/1958', 'Music', '2.05', '20'], '0034728': ['Armstrong, Lance', '0034728', '07/21/1993', 'Computer Science', '3.47', '10'], '7733469': ['Gaga, Lady', '7733469', '10/10/1980', 'Computer Science', '1.20', '40'], '9939456': ['Childs, Julia', '9939456', '12/12/1993', 'Computer Science', '3.89', '8'], '2245338': ['Johnson, Dwayne', '2245338', '08/30/1975', 'Music', '3.95', '2'], '4357349': ['Cronkite, Walter', '4357349', '10/02/1992', 'Math', '3.21', '0'], '8453392': ['Williams, Serena', '8453392', '02/14/1994', 'Math', '3.09', '5']}

我有另一本字典

Work = {'8': '9939456', '40': '7733469', '10': '0034728', '0': '4357349', '2': '2245338', '5': '8453392', '20': '1130327'}

我正在尝试计算每周工作超过X小时的所有学生的平均GPA。我的程序要求用户指定小时数,然后计算并打印答案。

def majoraveragespecific(Work, ID):
    averagemajordata = Work.keys()
    IDish= ID.values()

    averagemajorlist = list(averagemajordata)
    print()
    print()
    askthemajor = eval(input("For over which number of hours,  do you want to calculate average gpa hours for?: "))
    print("Alright, let's compute the average gpa hours for people who work over",askthemajor,"hours")
    if ID[id][5] > askthemajor:
        gpas = float(ID[id][5])
    return sum(gpas)/len(gpas)


print(majoraveragespecific(Work, ID)))

我不确定我是否使用了正确的方法..?

ID号是特定于每个学生的,工作时间是字典中每个ID的最后一个元素。

我会感激一点帮助,我已经为此工作了几天。

2 个答案:

答案 0 :(得分:0)

一个问题是你使用了错误的索引。 gpa位于指数4。

if ID[id][5] > askthemajor:
    # you are summing the hours, not gpa here
    gpas = float(ID[id][5])

此外,递归只会使这个函数比它需要的更复杂。尝试以下功能:

def average_gpa(hour, ids, work):
    gpas = [float(ids[id][4]) for hr, id in work.items() if hr >= hour]
    return sum(gpas)/len(gpas)

# prints the average gpa with study time >= 10 hrs
print average_gpa(10, ID, Work)

答案 1 :(得分:0)

首先,您的字典ID不应包含这样的信息级别。 思考对象。例如,您将拥有一个Person(或Student)类,其中包含:{name,FirstName等... AND ... workingTime} - >你不需要2本词典就可以了。

Rq:具体,因为我们不知道什么代表了工作的关键。 (我想这是几个小时。但为什么要将它存放在另一个字典中呢?)

您的ID dict将整数作为键,Person实例作为值。 顺便说一句,ID不是一个明确的名称。人或学生更适合。即使Ids是关键,你的dict的目标是通过id存储学生。

避免幻数。在你的情况下,5是一个幻数。我们可以猜测它的意义。但我们不必猜测。 (现在您看到要通过对象传递的实用程序?字段已命名)。

您还应模块化您的方法。为了更好的可读性,坚持单一责任原则。一种方法=一个目的。 这里 majoraveragespecific 计算平均值,但也进行过滤。制作一个新方法filter_student_by_working_hours(self,students,askThemajor):...

那就是说,我看不出主要词典对应的内容。 (你能帮助我吗?) averagemajordata = Major.keys()也已经是一个列表。 gpas = float(ID [id] [5]) 只是一个分配。 你错过了一个循环来聚集那些工作超过X小时的学生的所有GPA。 这就是过滤方法的目的。

计算部分是正确的。

最后但并非最不重要的是, majoraveragespecific(“Math”,Major,ID)如何才能发挥作用,因为majoraveragespecific只需要两个参数?

总而言之,您应该看一下这个链接。 http://starship.python.net/~goodger/projects/pycon/2007/idiomatic/handout.html 在Python中编写干净的代码对我帮助很大。