Используя выражение генератора и next()
function:
def find_by_key(d, key, value):
try:
return next(k for k, v in d.iteritems() if (key, value) in v.viewitems())
except StopIteration:
raise KeyError
Я предположил, что вы хотели KeyError
если нет словаря соответствия не найдено.
Выражение генератора фильтрует словарь по значениям, которые имеют пару ключ-значение, как определено тестом на членство в отношении dictionary items view.
Это минимальный объем работы, чтобы найти подходящий ключ.
Варианты:
В Python 3 dict.items()
уже вид и iteritems()
был угробил, так что используйте dict.items()
вместо:
return next(k for k, v in d.items() if (key, value) in v.items())
Если вы хотите, чтобы вернуть значение по умолчанию вместо при поднятии ключевой ошибки вы можете получить next()
:
def find_by_key(d, key, value):
return next(
(k for k, v in d.iteritems() if (key, value) in v.viewitems()),
None)
Демо:
>>> def find_by_key(d, key, value):
... try:
... return next(k for k, v in d.iteritems() if (key, value) in v.viewitems())
... except StopIteration:
... raise KeyError
...
>>> d = {
... "key1" : {"id" : 5},
... "key2" : {"id" : 6},
... }
>>> find_by_key(d, "id", 5)
'key1'
>>> find_by_key(d, "id", 6)
'key2'
>>> find_by_key(d, "id", 7)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in find_by_key
KeyError
Зависит от вашего определения "первого ключа". Учитывая, что дикты не заказываются, ваш «первый ключ» может быть разным каждый раз. – 2014-08-27 14:32:41
Определите «первый» здесь; словари не имеют порядка. –
Вы оба правы, исправляя вопрос. – Tzach