2017-10-16 73 views
1

對於文件:元組列出的問題:找不到在哪裏我犯了錯誤

Year Grade 
2000 100 
2002 95 
2001 88 
2012 99 
2000 66 

等等,我已經創建了一個會計算每次年級的平均值的函數。然而,我發現的是,不是最終得到一個列表,而是不斷得到一個元組。

我必須得到一個列表而不是元組才能通過斷言測試。

years, average_grades = [],[] 
    d = {} 

with open(file,'r') as f: 
    next(f) 
    for line in f: 
     year, grade = (s.strip() for s in line.split(',')) 
     if year in d: 
      d[year][0] += int(grade) 
      d[year][1] += 1 
     else: 
      d[year] = [int(grade),1] 

    for year, grades in d.items(): 
     years.append(int(year)) 
     average_grades.append(float(grades[0])/grades[1]) 
    years, average_grades = zip(*sorted(zip(years, average_grades), key= lambda p: p[0])) 

    return years, average_grades 

這個函數實際上給了我

年, 級2000,83 2001年,88 2002年,95 2012年,99

事情與此類似。它給了我每年的平均值。然而,它應該是有序的(按年),所以我已經完成了最後一步。

應該通過此:

years_answer = [I + 2000爲i的範圍(0,5)] assert_equal(年,years_answer)

錯誤我得到:

AssertionError: (2000, 2001, 2002, 2003, 2004, 2005, 2006[62 chars]2017) != [2000, 2001, 2002, 2003, 2004, 2005, 2006[62 chars]2017] 

有沒有解決這些問題的建議?

+2

它返回一個「元組」,因爲你明確*返回一個元組*,這就是'return years,average_grades'的意思......更重要的是,你需要什麼*輸出?它是不是'返回[年,average_grades]'? –

+0

有沒有什麼好方法可以返回列表而不是元組,同時確保計算結果爲真? –

+0

咦?再一次,我不知道你想要什麼輸出,但是隻要通過你的代碼,如果你想返回一個列表,你只需要'return [years,average_grades]',注意,這是一個*列表文字*。如果你只有逗號,那是一個元組... –

回答

1

選擇下列之一: -
1. return list(years),list(average_grades)代替return years, average_grades
2.使用assert_equal(list(years), years_answer)
3.使用assert_equal(years, tuple(years_answer))
4.使用years_answer = (i+2000 for i in range(0,5))

另外我不知道理解你的陳述This function actually gives me: Year, Grade 2000, 83 2001, 88 2002, 95 2012, 99。按代碼和OP函數的錯誤,其實是給予你year=(2000,2001,2002...)average_grades=(83,88,95...)

我們先來了解

years, average_grades = zip(*sorted(zip(years, average_grades), key= lambda p: p[0])) 

首先,讓我們來看看拉鍊does。讓我們分裂上面的語句改成較小的步驟...

years=[2001,2000,2002...] 
average_grades=[88,83,95...] 
it=zip(years, average_grades) 

it到底是在元組迭代器。

list(it)=[(2001,88), (2000,83),(2002,95)...] #State of variable 
排序後

..

st=sorted(it, key= lambda p: p[0])    #sorted returns a list 
st=[(2000,83), (2001,88), (2002,95)...]   #State of variable 

現在重新壓縮的元組..

ft=zip(*st)          #Note that zip takes only multiple arguments thus we need to splay the list using * 
list(ft)=[(2000,2001,2002...),(83,88,95...)] #State of variable 

現在終於當你這樣做......

years,average_grades=ft 
years=(2000,2001,2002...)   #State of variable 
average_grades=(83,88,95...)  #State of variable 

在這點years和元組不是列表。

+0

謝謝你一步一步來。我不熟悉python,並不真正知道zip會產生元組。 –

0

您需要更改的最後一行是returnstuples

return years, average_grades 

到一個地方,他們都明確地轉化爲lists

return list(years), list(average_grades) 

這將作爲zip()returnstuplesiterator什麼時候你想要的是lists。我們知道這是從the documentation

拉鍊(* iterables)

作出這樣的聚合來自各個iterables的元素的迭代器。

相關問題