Обратный поиск по словарю в Python - PullRequest
80 голосов
/ 02 апреля 2010

Есть ли простой способ найти ключ, зная значение в словаре?

Все, что я могу думать, это:

key = [key for key, value in dict_obj.items() if value == 'value'][0]

Ответы [ 14 ]

0 голосов
/ 19 июля 2017

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

db = {0:[], 1:[], ..., 5:None, 11:None, 19:[], ...}

keys_to_reallocate = [None]
allocate.extend(i for i in db.iterkeys() if db[i] is None)
free_id = keys_to_reallocate[-1]

Мне нравится этот, потому что мне не нужно пытаться ловить какие-либо ошибки, такие как StopIteration или IndexError. Если есть доступный ключ, то free_id будет содержать его. Если нет, то это будет просто None. Возможно, не питон, но я действительно не хотел использовать try здесь ...

0 голосов
/ 25 июня 2014
key in dict.values()

Это буквально это

0 голосов
/ 03 апреля 2010

Я знаю, что это может считаться «расточительным», но в этом сценарии я часто сохраняю ключ как дополнительный столбец в записи значения:

d = {'key1' : ('key1', val, val...), 'key2' : ('key2', val, val...) }

это компромисс и кажется неправильным, но он прост и работает и, конечно, зависит от того, являются ли значения кортежами, а не простыми значениями.

0 голосов
/ 03 апреля 2010

Сквозные значения в словаре могут быть объектами любого вида, которые они не могут быть хэшированы или проиндексированы другим способом. Поэтому найти ключ по значению неестественно для этого типа коллекции. Любой такой запрос может быть выполнен только за O (n) раз. Так что, если это частая задача, вам следует взглянуть на индексирование ключа, например, Jon sujjested или, возможно, даже на пространственный индекс (DB или http://pypi.python.org/pypi/Rtree/).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...