2015-01-03 23 views
2

我有一本字典如果從字典比較列出

alice = { 
    "name": "Alice", 
    "homework": [100.0, 92.0, 98.0, 100.0], 
    "quizzes": [82.0, 83.0, 91.0], 
    "tests": [89.0, 97.0] 
} 

而這需要一個列表

def average(numbers): 
    return float(sum(numbers))/len(numbers) 

我想Python函數get_average(平均)的功能,通過一本字典閱讀。之後,我希望函數能夠獲取字典中列表的平均值,然後將該列表的平均值與特定數字相乘(評分權重爲.10作爲作業,0.30作爲測驗,或者60作爲測試),並給出加權作業,測驗和測試的總數。我正在使用if語句來檢查從字典中for循環中選擇的列表是否爲作業,測驗或測試。

def get_average(alice): 
    hw=0 
    qz=0 
    ts=0 

    for assignment in student: 
     if assignment== ["homework"]: 
      hw=average(assignment)*.10 
     if assignment==["quizzes"]: 
      qz=average(assignment)*.30 
     if assignment==["tests"]: 
      ts=average(assignment)*.60 

    return hw+qz+ts 

這隻返回零。它應該是91.15

回答

1

循環訪問字典會爲您提供字典中的鍵。您需要使用您的平均功能的值。您還可以遍歷鍵和值在同一時間與iteritems

這應該工作:

for assignment, scores in student.iteritems(): 
    if assignment=="homework": 
     hw=average(scores)*.10 
    if assignment=="quizzes": 
     qz=average(scores)*.30 
    if assignment=="tests": 
     ts=average(scores)*.60 

return hw+qz+ts 

你也可以只通過字典和,而不是分數循環有學生[分配],但這將需要在每個循環迭代中進行兩次查找,所以最好使用iteritems。

+0

我是新來的蟒蛇。當你輸入「分配,分數......」是字典中的分數呢? – fathalpert

+0

在這種情況下,爲了將來的兼容性,最好使用'dict.items()'而不是'iteritems()'。 – Keith

+0

如果他使用python3 yes,但對於python2 iteritems將會減少內存和時間密集度......對於像這樣的3個元素字典而言,這並不重要,但作爲一個原則,它應該顯示iteritems。對? – austin1howard

0

有代碼中的一些錯誤:

  1. assignment迭代中get_average()功能的學生即'name''homework'等按鍵。因此請將其與字符串'homework'比較,而不要與列表['homework']
  2. 正如我所說assignment包含密鑰,所以你需要調用average與該鍵即價值,student[assignment]
  3. 你迭代student變量get_average()功能,所以它應該是get_average(student)而非get_average(alice)

演示:

>>> def get_average(student): 
...  hw=0 
...  qz=0 
...  ts=0 
...  for assignment in student: 
...  # assignment iterates over keys of student i.e., 'name', 'homework' etc. So compare it with string 'homework' not with list ['homework'] 
...   if assignment== "homework": 
...   # as I said assignment contains keys, so you need to call average with value of that key i.e., student[assignment] 
...    hw=average(student[assignment])*.10 
...   if assignment=="quizzes": 
...    qz=average(student[assignment])*.30 
...   if assignment=="tests": 
...    ts=average(student[assignment])*.60 
...  return hw+qz+ts 
... 
>>> def average(numbers): 
...  return float(sum(numbers))/len(numbers) 
... 
>>> alice = { 
...  "name": "Alice", 
...  "homework": [100.0, 92.0, 98.0, 100.0], 
...  "quizzes": [82.0, 83.0, 91.0], 
...  "tests": [89.0, 97.0] 
... } 
>>> get_average(alice) 
91.14999999999999 
+0

謝謝你的工作。我正在使用正確的字典格式 – fathalpert

0

如果你使用python 3,使用items(),爲iteritems()已經從這個版本中刪除:

def get_average(alice): 

    tot = 0 
    for tests, grades in alice.items(): #iterates over keys and values 
     if tests == "homework": 
      tot += average(grades)*0.1 
     if tests == "quizzes": 
      tot += average(grades)*0.3 
     if tests == "tests": 
      tot += average(grades)*0.6 

    return tot 

而且使用字典理解另一種方法:

def get_average(alice): 

    tot = 0 
    gen = {test: average(grades) for test, grades in alice.items() if isinstance(grades, list)} 
    for test, grades in gen.items(): 
     if test == "homework": 
      tot += grades*0.1 
     if test == "quizzes": 
      tot += grades*0.3 
     if test == "tests": 
      tot += grades*0.6 

    return tot 
2

釷其他答案綽綽有餘。我只是想嘗試一些不同的嘗試。

使用此方法,您可以輕鬆擴展標記標準的深度,而不會使用所有額外的if語句擴大功能的大小。編輯也更容易,海事組織,重複數量少,而且重要。

alice = { 
    "name": "Alice", 
    "homework": [100.0, 92.0, 98.0, 100.0], 
    "quizzes": [82.0, 83.0, 91.0], 
    "tests": [89.0, 97.0] 
} 

def average(numbers): 
    return float(sum(numbers))/len(numbers) 

def get_average(student): 
    criteria = {'homework': 0.10, 'quizzes': 0.30, 'tests': 0.60} 
    return sum(y * average(student[x]) for (x,y) in criteria.iteritems()) 

alice['average'] = get_average(alice) 

print alice 

希望這會有所幫助。

+0

對於OP,其他人只是簡單地展示如何解決您的問題,這個答案確實是pythonic更多,應該是如何編寫python代碼。 – austin1howard