2014-12-19 4 views
1

Я ищу простой способ проверки наличия в списке вложенного объекта.Определить, находится ли вложенный объект в списке

Например

example_list = [{'id':1, 'name':'k'}, {'id':2, 'name':'y'}, {'id':3, 'name':'z'}] 

Есть простая функция, которая будет определять, если ДИКТ с id=3 находится в example_list? Я не хочу использовать цикл, потому что он кажется излишним.

+1

'If {id: 3} в списке примеров:' должен работать – user2097159

+0

Почему бы не хранить e их в словаре, введенном ключом «id», вместо списка? – jonrsharpe

+0

Это не будет работать, потому что у dicts больше свойств, чем просто id .. Извините, пример не был ясен – Jakobovski

ответ

3

Вы можете использовать any и generator expression:

if any(x['id'] == 3 for x in example_list): 

Конечно, это предполагает, что все словари имеют id ключ. Если нет, то вы можете сделать:

if any(x.get('id', 0) == 3 for x in example_list): 

Update:

Чтобы получить словарь вернулся, использовать next:

dct = next((x for x in example_list if x['id'] == 3), None) 

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

+0

Ницца. Как мне вернуть dict после того, как я определил, что он существует? – Jakobovski

+0

@ Якобовски - Смотрите мое редактирование. – iCodez

+0

Без преимущества использования выражения генератора здесь действительно для одного значения –

1

Если вы хотите только первый ДИКТ, который содержит id == 3` использовать обычный цикл:

for d in example_list: 
    if d.get("id") == 3: 
     print(d) 
     break 

Если вы хотите, чтобы все dicts использовать список Комп:

[d for d in example_list if d.get("id") == 3] 

Вы можете использовать функцию и вернуть dict:

def get_d(l, key, val): 
    for d in l: 
     if d.get(key) == val: 
      return d 
Смежные вопросы