Python 元组列表问题:can';I don’我找不到我犯过的错误

Python 元组列表问题:can';I don’我找不到我犯过的错误,python,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: ye

档案:

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年

类似的东西。它给了我每年的平均值。然而,它应该是有序的(根据年份),所以我已经完成了最后一步

应通过以下程序:

年_答案=[i+2000,i在范围(0,5)] 断言等于(年、年、答案)

我得到的错误是:

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

有没有解决这些问题的建议

您需要更改
返回元组的最后一行:

return years, average_grades
将其显式转换为
列表

return list(years), list(average_grades)
这将作为
zip()
返回
元组的
迭代器
当您需要的是
列表时。我们从以下方面了解到这一点:

拉链(*iterables)

制作一个迭代器,聚合来自每个ITerable的元素


选择以下选项之一:-
1. <代码>返回列表(年份),列表(平均等级)
代替
返回年份,平均等级

2.使用
assert\u equal(列出(年份),年份\u答案)

3.使用
assert_equal(年、元组(年、答案))

4.使用
years\u answer=(i+2000表示范围(0,5)内的i)

另外,我不理解你的陈述
这个函数实际上给了我:年份,2000级,83 2001,88 2002,95 2012,99
。根据代码和OP函数中的错误,实际给出了
年份=(200020012002…
平均分数=(83,88,95…

让我们了解一下

years, average_grades = zip(*sorted(zip(years, average_grades), key= lambda p: p[0]))
首先让我们看看拉链是什么。让我们把上面的陈述分成几个小步骤

years=[2001,2000,2002...]
average_grades=[88,83,95...]
it=zip(years, average_grades)
的末尾,它是元组上的迭代器

   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
average\u grades
是元组而不是列表。

它返回一个
tuple
,因为您显式返回一个元组,这就是
返回年份,average\u grades
的意思。。。更重要的是,您需要什么样的输出?是否必须返回[years,average_grades]
?有没有什么好方法可以返回列表而不是元组,同时确保计算结果是真实的?嗯?同样,我不知道您想要什么输出,但只是按照您的代码,如果您想要返回一个列表,您只需要
返回[years,average_grades]
,注意,这是一个列表文字。如果只有逗号,那就是元组…试试<代码>返回列表(年份)、列表(平均等级)
。注意,zip总是返回元组。这确保了
years
[20002001…]
而不是
(20002001,…)
[years,average_grades]确实给了我一个列表,但又一个问题是,除了第一个元素(2000)之外,它没有计算其他元素的平均等级。感谢您一步一步地进行。我不熟悉python,也不知道zip会产生元组。