2015-10-30 5 views
-1

У меня есть метод, который принимает список имен полей. В методе я делаю вызов API, чтобы получить запись, которая будет содержать список словарей полей.Создать один словарь из списка словарей

API Пример вызова:

"fields": [ 
    { 
     "datetime_value": "1987-02-03T00:00:00", 
     "name": "birth_date" 
    }, 
    { 
     "text_value": "Dennis", 
     "name": "first_name" 
    }, 
    { 
     "text_value": "Monsewicz", 
     "name": "last_name" 
    }, 
    { 
     "text_value": "Male", 
     "name": "sex" 
    }, 
    { 
     "text_value": "White", 
     "name": "socks" 
    } 
    ] 

Мой метод макияж выглядит contact(contact_id, contact_fields) где contact_fields выглядит ['last_name', 'first_name']

Окончательный fields словарь Я пытаюсь создать будет выглядеть (не беспокоюсь о порядке):

{ 
    "last_name": "Monsewicz", 
    "first_name": "Dennis" 
} 

Итак, в основном создайте один словарь, в котором ключ является name атрибут из каждого словаря в списке, но только если name находится в списке имен полей, переданных в этот метод.

Я попытался это:

"fields": {x: y for x, y in contact['fields'] if x in contact_fields} 
+0

который является вашей проблемой? где ваша попытка? –

+0

@Borja вопрос обновлен, чтобы включить то, что я пробовал – dennismonsewicz

ответ

3

Что-то вроде этого?

>>> fields 
[{'datetime_value': '1987-02-03T00:00:00', 'name': 'birth_date'}, 
{'name': 'first_name', 'text_value': 'Dennis'}, 
{'name': 'last_name', 'text_value': 'Monsewicz'}, 
{'name': 'sex', 'text_value': 'Male'}, 
{'name': 'socks', 'text_value': 'White'}] 
>>> output = {} 
>>> for field in fields: 
...  key = field.pop('name') 
...  _unused_key, value = field.popitem() 
...  output[key] = value 
...  
>>> output 
{'birth_date': '1987-02-03T00:00:00', 
'first_name': 'Dennis', 
'last_name': 'Monsewicz', 
'sex': 'Male', 
'socks': 'White'} 
+0

Спасибо! Есть ли все-таки написать это в одном лайнере? – dennismonsewicz

+1

Да, но это было бы некрасиво. Избегайте соблазна к одному слою, когда это не подходит. – wim

-1

Как насчет этого однострочного?

output = dict((x['name'], x['text_value']) for x in fields) 

Он в основном проходит через поля, вытаскивает пары name/text_value, затем строит из него dict.

+0

Это будет работать красиво, но 'text_value' не всегда является ключом. Это может быть один из 'text_value',' datetime_value', 'boolean_value' и т. Д. – dennismonsewicz

+0

Тогда может быть что-то вроде:« x.get («text_value») или x.get ('datetime_value') или x.get ('boolean_value') "вместо" x ['text_value'] ". – swstephe

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