используя изображение в качестве ключа - PullRequest
0 голосов
/ 10 февраля 2019

Можно ли использовать изображение в качестве ключа в dict в Python?

answer_List = {One : 1, Two : 2, Three :3, Four : 4, Five : 5, Six : 6}

, где 1-6 - файлы png.Я новичок в Python, и я продолжаю читать, что он очень гибкий и что-нибудь может быть сохранено и как угодно.Тем не менее, я получаю сообщение об ошибке

Ошибка типа: unhashable Тип: 'PngImageFile'

спасибо.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Общее правило для словарного ключа - вы хотите, чтобы он был неизменным.Если вы внесете изменение в ключевой объект, внутренняя структура данных dict испортится.

Изображения очень изменчивы, вы можете изменить пиксель в любое время.Изменяемые объекты не заботятся о реализации метода __hash__, потому что он будет бесполезен.Вот что говорит вам сообщение об ошибке.

Лучше использовать прокси для изображения.Одно хорошее предложение в другом ответе состоит в том, чтобы использовать имя файла изображения, но это предполагает, что каждое изображение происходит из файла, и нет никаких повторяющихся изображений с разными именами файлов.Другой способ - заморозить содержимое изображения во что-то неизменное, например, строку байтов, но это будет крайне неэффективно, потому что строка байтов будет большой.Вы можете решить эту проблему, используя криптографический хеш для получения строки, уникальной для каждого входного изображения.

import hashlib

def ImageID(im):
    return hashlib.md5(im.tobytes()).hexdigest()

Этот метод полезен не только для dict с.Я использовал его для ключей базы данных для обложек mp3, так как многие файлы будут делиться изображением.

0 голосов
/ 10 февраля 2019

Объект должен быть хешируемым, если он будет использоваться в качестве ключа словаря.Т.е. он должен иметь (или наследовать) метод __hash__.

Я не уверен, чего вы пытаетесь достичь, но если вам нужны значения, связанные с вашими изображениями, вы можете дляЭкземпляр использует свои имена файлов в качестве ключей:

{One.filename: 1, Two.filename: 2, ...}
...