поиск значений из списка словарей, в которых ключи имеют различное количество ключей - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть список словарей с различным количеством ключей / значений, я не могу изменить список, потому что он извлечен из другой программы, над которой у меня нет контроля:

l = [{'a': 123, 'b': 234, 'c': 'approved'}, {'a': 456, 'b': 567}, {'a': 678, 'b': 789, 'c': 'approved'}]

Я хочу получить списокзначений для ключа 'a', где ключ 'c' == 'утвержден', если я попытаюсь:

approved_list = [i['a'] for i in l if i['c'] == 'approved']

Я получаю ошибку: KeyError: 'c' Я предполагаю, потому что у dict [1] нет ключа'c'.

Я попытался получить список словарей, включающий в себя только те, у которых есть ключ 'c', подобный следующему:

dicts_with_approval = [i for i in l if i.keys() == 'c']

, но это просто дает пустой список [].

Помощь оценена.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Вы можете изменить свой ответ следующим образом (проверьте, находится ли "c" в keys из dict:

approved_list = [i['a'] for i in l if "c" in i.keys() if i['c'] == 'approved' ]
0 голосов
/ 21 сентября 2018

Ваш подход здесь немного некорректен

[i for i in l if i.keys() == 'c'] 

Вы пытаетесь проверить, равен ли список i.keys() одному ключевому элементу c, который никогда не будет верным.Следовательно, все должно быть наоборот, необходимо проверить, присутствует ли ключ c в словаре i.keys().

Изменить существующий код

[i['a'] for i in l if 'c' in i.keys() and 'approved'==i['c']] # [123, 678]
0 голосов
/ 21 сентября 2018

Вместо этого можно использовать dict.get, чтобы указать значение в случае сбоя при поиске ключа:

[i['a'] for i in l if i.get('c') == 'approved']
# [123, 678]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...