Как создать новый словарь, ключи которого находятся в другом словаре? ошибка типа unhashable - PullRequest
0 голосов
/ 19 ноября 2018

Мне нужно создать новый словарь, который использует те же ключи, что и первый, в то время как значения оригинала были усреднены.Пока значения не доставляют мне неприятностей, но я не знаю, как решить ошибку «unhashable type».Я должен упомянуть, что оригинальный словарь использует кортежи в качестве ключей и значений.

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 голосов
/ 19 ноября 2018

Согласно это

hashable

Объект является хэшируемым, если у него есть значение хеша, которое никогда не изменяется в течение его жизни(для этого требуется метод hash ()) и его можно сравнить с другими объектами (для этого требуется метод eq ()).Хэшируемые объекты, которые сравниваются равными, должны иметь одно и то же значение хеш-функции.

Хэш-стабильность делает объект пригодным для использования в качестве ключа словаря и члена набора, поскольку эти структуры данных используют значение хеш-функции внутри.

ВсеНеизменяемые встроенные объекты Python являются хэшируемыми, в то время как нет изменяемых контейнеров (таких как списки или словари).Объекты, которые являются экземплярами пользовательских классов, по умолчанию могут быть хэшируемыми;все они сравниваются неравно, и их хеш-значением является их id ().

Это означает, что ключ не может быть списком, который возвращает dict.keys ().Таким образом, вы можете использовать словарное понимание, как некоторые упоминали до меня.Это должно выглядеть так.

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

И это должно сработать.Надеюсь, это помогло:)

0 голосов
/ 19 ноября 2018

Ваше словарное понимание неверно. Попробуйте это:

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

Одна из причин, по которой вы получали ошибки, была в том, что вы пытались использовать studentPerf.keys() в качестве ключа словаря, потому что это либо итератор в Python 3, либо список в Python 3, ни один из которых не может быть хэшируемым.

0 голосов
/ 19 ноября 2018

Вы получаете ошибку неисчислимого типа, потому что, когда вы сделали .keys (), результат выглядел бы как

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

Python не может сделать это, так как dict_keys не является приемлемым типом какключ.Еще одна вещь, которую стоит отметить в вашем коде, это то, что вы пытались делать ключи и значения отдельно.Dict не гарантирует порядок.Даже если код сработал.Заказ был бы испорчен.

Правильный способ сделать это с пунктами, как показано ниже

{student: sum(student_marks)/4 for student, student_marks in studentPerf.items()}
0 голосов
/ 19 ноября 2018

Используйте 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...