2017-02-15 4 views
0

Как я могу получить значение словаря в списке словарей на основе словаря, удовлетворяющего некоторому условию? Например, если один из словарей в списке имеет идентификатор = 5, я хочу, чтобы напечатать значение, соответствующее name ключа этого словаря:Python - Получить элемент словаря в списке словарей после оператора if

list = [{'name': 'Mike', 'id': 1}, {'name': 'Ellen', 'id': 5}] 
id = 5 
if any(m['id'] == id for m in list): 
    print m['name'] 

Это не будет работать, потому что m не определена вне оператор if.

ответ

3

У вас есть список словарей, так что вы можете использовать список понимание:

[d for d in lst if d['id'] == 5] 

# [{'id': 5, 'name': 'Ellen'}] 
3
new_list = [m['name'] for m in list if m['id']==5] 
print '\n'.join(new_list) 
1

Это будет легко сделать с одним для цикла:

for d in list: 
    if 'id' in d and d['in'] == 5: 
     print(d['name']) 

Здесь есть две ключевые концепции. Во-первых, мы использовали for loop для «прохождения каждого элемента списка». Во-вторых, мы использовали слово in, чтобы проверить, есть ли в словаре определенный ключ.

+0

Так как это может быть обработано с довольно основным списком пониманием, я бы предположил, что это «Pythonic» способ решить свою проблему, так как против явного написания цикла. – Aaron

+0

@ Аарон Я сомневаюсь, что просто распечатать имя - цель. Если мы предположим, что в этот момент нужна еще более сложная логика, понимание списка может оказаться нецелесообразным. (И OP, похоже, не понимает, как использовать словари, поэтому я думаю, что это плохое время, чтобы объяснить понимание списков.) – theJollySin

0

Как насчет следующего?

for entry in list: 
    if entry['id']==5: 
     print entry['name'] 
0

Она не существует в Python2, но простое решение в Python3 будет использовать ChainMap вместо list.

import collections 

d = collections.ChainMap(*[{'name':'Mike', 'id': 1}, {'name':'Ellen', 'id': 5}]) 
if 'id' in d: 
    print(d['id']) 
0

Вы можете сделать это с помощью функции фильтра:

lis = [ {'name': 'Mike', 'id': 1}, {'name':'Ellen', 'id': 5}] 
result = filter(lambda dic:dic['id']==5,lis)[0]['name'] 
print(result)