2014-08-27 3 views
0

У меня есть Dict из dicts:Найти в Словаре от dicts на основе значения

d = { 
    "key1" : {"id" : 5}, 
    "key2" : {"id" : 6}, 
} 

Самых вещий способ найти некоторые (не имеет значения, какие) ключа в этом Словаре, что это значение имеет конкретная пара ключей/значений? В моем примере я хотел бы что-то вроде:

result = find_by_key(d, "id", 5) # should return "key1" 
+2

Зависит от вашего определения "первого ключа". Учитывая, что дикты не заказываются, ваш «первый ключ» может быть разным каждый раз. – 2014-08-27 14:32:41

+0

Определите «первый» здесь; словари не имеют порядка. –

+0

Вы оба правы, исправляя вопрос. – Tzach

ответ

5

Используя выражение генератора и 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 
Смежные вопросы