一個XY problem的一個很明顯的情況下...
你真正的問題是一個錯誤的數據結構,以相同的方式存儲異質信息(學生的名字和它的標記)。該RightSolution(TM)是使用一個更好的數據結構,即:
student1 = {
"personal_infos" : {
"name": "Lloyd",
},
"marks": {
"homework": [90, 97, 75, 92],
"quiz": [88, 40, 94],
"test": [75, 90]
},
"totals": {}
"averages": {}
}
}
一旦你有了這個,你沒有來測試你是否有一個字符串或num的值:
def eachSubjAverage(student):
for subject, marks in student["marks"].items():
total = sum(marks) #totalling each marks
student["totals"][subject] = total
average = total/(len(marks))
student["averages"][subject] = average
請注意,您可以以不同的佈局你的數據,每個主題,即:
student1 = {
"personal_infos" : {
"name": "Lloyd",
},
"subjects": {
"homework": {
"marks" : [90, 97, 75, 92],
"total" : None,
"average" : None
},
"quiz": {
"marks" : [88, 40, 94],
"total" : None,
"average" : None
},
"test": {
"marks" : [75, 90],
"total" : None,
"average" : None
},
},
}
def eachSubjAverage(student):
for subject, data in student["subjects"].items():
total = sum(data["marks"]) #totalling each marks
data["total"] = total
average = total/(len(data["marks"]))
data["average"] = average
請注意,如果您還沒有運要修復數據結構(外部數據或其他),您仍然要不想依賴於類型檢查(最好是脆弱的) - 您要測試密鑰本身,可以通過將主題名稱列入白名單或黑名單「非主體」的名字,即:
# blacklist non-subjects
NON_SUBJECTS = ("name",)
def your_func(student):
for key, value in student.items():
if key in NON_SUBJECTS:
continue
compute_stuff_here()
哦,是的:將在標記列表中的總平均也是搬起石頭砸自己的腳的好方法 - 一旦它的完成,你可以」告訴最後兩個「標記」是標記還是(總數,平均值)。
注意,字典是沒有順序的,爲了將不是你所期望的順序,以便追加。 http://stackoverflow.com/questions/15479928/why-is-the-order-in-python-dictionaries-and-sets-arbitrary – Tim
@Tim:代碼附加到列表,而不是字典 - FWIW,字典沒有一個「追加」方法。將平均值和總和附加到商標上仍然是一個糟糕的主意,但出於不同的原因... –