如何创建一个新的词典,其键是来自另一个词典的键?无法散列的类型错误

时间:2018-11-19 02:37:54

标签: python dictionary tuples

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

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 个答案:

答案 0 :(得分:2)

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

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

出现错误的部分原因是尝试使用studentPerf.keys()作为字典键,因为它在Python 3中是迭代器,或者在Python 3中是list,两者都不是可哈希的。

答案 1 :(得分: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}

答案 2 :(得分: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()}

答案 3 :(得分:1)

根据this

  

可哈希

     

如果对象的哈希值在其生命周期内始终不变(需要 hash ()方法),并且可以与其他对象进行比较(需要 eq ()方法)。比较相等的可哈希对象必须具有相同的哈希值。

     

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

     

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

这意味着键不能是列表,这是dict.keys()返回的内容。因此,您可以像我之前提到的那样使用字典理解。看起来应该像这样。

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

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