2

我需要制作一个新字典,它使用与第一个相同的键,而原始值已被平均。到目前为止,这些值并没有给我带来麻烦,但我不知道如何解决“不可散列类型”错误。我应该提到原始字典使用元组作为它的键和值。

studentPerf = 
{('Jeffery','male','junior'):[0.81,0.75,0.74,0.8],
('Able','male','senior'):[0.87,0.79,0.81,0.81],
('Don','male','junior'):[0.82,0.77,0.8,0.8],
('Will','male','senior'):[0.86,0.78,0.77,0.78]}

dictAvgGrade = {studentPerf.keys():[(sum(grade)/4) for grade in studentPerf.values()]}
4

4 回答 4

2

您的字典理解不正确。尝试这个:

dictAvgGrade = {key: sum(grades)/len(grades) for key, grades in studentPerf.items()}

出现错误的部分原因是尝试studentPerf.keys()用作字典键,因为它要么是 Python 3 中的迭代器,要么是 Python 3 中的列表——它们都不是可散列的。

于 2018-11-19T02:44:40.827 回答
1

使用dictionary comprehension

print({k:sum(v)/len(v) for k,v in studentPerf.items()})

输出:

{('Jeffery', 'male', 'junior'): 0.7749999999999999, ('Able', 'male', 'senior'): 0.8200000000000001, ('Don', 'male', 'junior'): 0.7974999999999999, ('Will', 'male', 'senior'): 0.7975000000000001}
于 2018-11-19T02:42:54.627 回答
1

您收到一个不可哈希的类型错误,因为当您执行 .keys() 时,结果看起来像

{dict_keys([('Jeffery', 'male', 'junior'), ('Able', 'male', 'senior'), ('Don', 'male', 'junior'), ('Will', 'male', 'senior')]): SOMETHING}

Python 不能这样做,因为 dict_keys 不是可接受的键类型。在您的代码中还需要注意的另一件事是,您尝试分别执行键和值。字典不保证顺序。即使代码有效。订单会搞砸的。

正确的做法是使用以下项目

{student: sum(student_marks)/4 for student, student_marks in studentPerf.items()}
于 2018-11-19T02:48:04.460 回答
1

据此_

可散列的

如果一个对象有一个在其生命周期内永远不会改变的哈希值(它需要一个hash () 方法),并且可以与其他对象进行比较(它需要一个eq () 方法),那么它就是可哈希的。比较相等的可散列对象必须具有相同的散列值。

哈希性使对象可用作字典键和集合成员,因为这些数据结构在内部使用哈希值。

Python 的所有不可变内置对象都是可散列的,而没有可变容器(例如列表或字典)是可散列的。默认情况下,作为用户定义类实例的对象是可散列的;它们都比较不相等,它们的哈希值是它们的 id()。

这意味着键不能是列表,这是 dict.keys() 返回的。所以你可以使用字典理解,就像我之前提到的一些。应该是这样的。

    dictAvgGrade = {key: sum(values)/len(values) for key,values in studentPerf.items()}

这应该可以解决问题。希望它有所帮助:)

于 2018-11-19T02:52:41.807 回答