Обратный поиск по словарю в Python

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

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

key = [key for key, value in dict_obj.items() if value == 'value'][0]
86
задан vaultah 21 February 2017 в 16:38
поделиться

6 ответов

Нет ни одного. Не забывайте, что значение может быть найдено на любом количестве ключей, включая 0 или более 1.

11
ответ дан 24 November 2019 в 07:59
поделиться

Бывают случаи, когда словарь является отображением типа «один: один»

Например,

d = {1: "one", 2: "two" ...}

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

ivd = {v: k for k, v in d.items()}

. Если есть вероятность, что несколько ключей с одним и тем же значением, вам нужно будет указать желаемое поведение в этом случае.

Если ваш Python 2.6 или старше, вы можете использовать

ivd = dict((v, k) for k, v in d.items())
51
ответ дан 24 November 2019 в 07:59
поделиться

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

key = next(key for key, value in dd.items() if value == 'value')

, где dd - это dict. Будет вызывать StopIteration , если совпадение не найдено, поэтому вы можете перехватить это и вернуть более подходящее исключение, например ValueError или KeyError .

82
ответ дан 24 November 2019 в 07:59
поделиться

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

0
ответ дан 24 November 2019 в 07:59
поделиться

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

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

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

0
ответ дан 24 November 2019 в 07:59
поделиться

Насколько я знаю, такого нет, но один из способов сделать это - создать диктант для обычного поиска по ключу и другой диктант для обратного поиска по значению.

Вот пример такой реализации:

http://code.activestate.com/recipes/415903-two-dict-classes-which-can-lookup-keys-by-value-an/

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

2
ответ дан 24 November 2019 в 07:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: