列出问题的元组:无法找到我犯错误的地方

时间:2017-10-16 16:31:14

标签: python

对于档案:

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 for i in range(0,5)]     assert_equal(years,years_answer)

我得到的错误:

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

解决此类问题的任何建议?

2 个答案:

答案 0 :(得分: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]))

首先让我们看一下zip 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

此时yearsaverage_grades是元组而不是列表。

答案 1 :(得分:0)

您需要更改returns tuples

的最后一行
return years, average_grades

将其明确转换为lists

return list(years), list(average_grades)

当您想要的是zip()时,这将作为returns iterator tuples lists 。我们从the documentation知道这一点:

  

拉​​链(* iterables)

     

创建一个聚合来自每个迭代的元素的迭代器。