2015-09-10 3 views
2

У меня есть список словарей с 2 ​​ключами: 'name' & 'value'. Мне нужно получить значение ключа «value», если значение «name» имеет значение «Subject»Получить значение ключа из списка словаря

В настоящее время я выполняю итерацию через каждый dict и проверяю значение «name» и получаю значение «value», , Есть ли улучшенный способ сделать это?

items = [ 
      { 
       "name": "From", 
       "value": "[email protected]" 
      }, 
      { 
       "name": "Date", 
       "value": "Tue, 8 Sep 2014 16:18:35 +0530" 
      }, 
      { 
       "name": "Subject", 
       "value": "Test Subject" 
      }, 
      { 
       "name": "To", 
       "value": "[email protected]" 
      }, 
     ] 

for item in items: 
    if item.get('name') == 'Subject': 
     print "Subject: " + item.get('value') 
+2

В зависимости от того, как вы определяете «улучшенный» - быстрее? короче? симпатичнее? –

+3

Вы ищете «встроенную» структуру данных? просто используя '{'From': '[email protected]', 'Subject': 'Test Subject', ...}' будет выглядеть «улучшенным» для меня и будет легче обрабатывать. –

+0

У меня в списке больше 50 dict. И мне нужно всего несколько значений (~ 5 из них) «Тема», «От» и «Кому» и т. Д. – Rookie

ответ

3

Вы должны перенести свои данные в Словаре вместо:

>>> d = dict([(e['name'],e['value']) for e in items]) # transpose 

Или немного более простой способ, как указано Питер Вуд в комментариях:

>>> d = {e['name']: e['value'] for e in items} 

Тогда просто использовать Dict как обычно:

>>> d['Subject'] 
'Test Subject' 
+0

* Вы должны перенести свои данные в dict вместо * - почему? –

+1

@TimCastelijns Алгоритмы и структуры данных идут рука об руку. OP имеет неправильную структуру данных для такого рода алгоритмов, поэтому Jonas временно создает правильную структуру данных. Возможно, OP будет думать о том, чтобы заменить его навсегда. –

+2

@PeterWood извините, мой комментарий был не совсем ясен. * Я * знаю, почему диктов лучше, но, возможно, нет. Рассказывая ему, почему лучше дик, вместо того, чтобы говорить «просто сделай это», я думаю, что я думаю –

1

Как Jonas сказал, лучше изменить вашу структуру because

from collections import defaultdict 
it = [ 
      { 
       "name": "From", 
       "value": "[email protected]" 
      }, 
      { 
       "name": "Date", 
       "value": "Tue, 8 Sep 2014 16:18:35 +0530" 
      }, 
      { 
       "name": "Subject", 
       "value": "Test Subject" 
      }, 
      { 
       "name": "Subject", 
       "value": "Test Subject 55" 
      }, 
      { 
       "name": "To", 
       "value": "[email protected]" 
      }, 
     ] 


result = defaultdict(list) 
# shorcut better to use for... 
[result[item["name"]].append(item["value"]) for item in it] 

print(result["Subject"]) 
['Test Subject', 'Test Subject 55'] 
+0

В первой строке отсутствует имя 'defaultdict'. –

+0

Только что сделал редактирование :) –

2

Вы можете использовать next наряду с фильтрацией генератора и преобразования элементов.

>>> subject = next(field['value'] 
...    for field in items 
...    if field['name'] == 'Subject') 
+1

Ницца, но мне больше нравится понимание Питера Вуда .. –

+0

@TimCastelijns спасибо! –

Смежные вопросы