2016-01-28 2 views
1

У меня есть объект JSON, который содержит всевозможные ненужные значения, такие как "null", "", None. Я хотел бы удалить весь объект, если он содержит такое значение.Удалить элемент в списке словарей, если значение пуста, «null» или None в Python

>>> json.dumps(event, indent=4) 
"event" = { 
    "status": "COMPLETED", 
    "dataValues": [ 
    { 
     "key": "wiiDcsQ5pdQ", 
     "value": "25" 
    }, 
    { 
     "key": "RsZ4gQzWPWU", 
     "value": "null" 
    }, 
    { 
     "key": "L7aO70bcrbP", 
     "value": "" 
    }, 
    { 
     "key": "gY6pXRwdThm", 
     "value": "null" 
    }, 
    { 
     "key": "x1708y0C4C7", 
     "value": False 
    } 
    ] 
} 

Мои неудачные попытки:

no_values = ["null", "", None] 

# no changes/deletions: 
[elem for elem in event['dataValues'] if elem['value'] not in no_values] 

# TypeError: argument of type 'bool' is not iterable 
[elem for elem in event['dataValues'] if any(s in elem['value'] for s in no_values] 

Как я могу это сделать?

+1

Вы пытались сохранить свой первый аспект в переменной? Потому что он не изменяет оригинал – RvdK

+0

Да .. Ошибка печати или повторного ввода – toefftoefftoeff

ответ

2

Это работает для меня, где я храню данные в переменной и оцениваю ее, используя ваше первое понимание списка. Обратите внимание, что я использую набор ignored_values, который немного быстрее:

In [12]: import json 

In [13]: json_text = """{ 
    "status": "COMPLETED", 
    "dataValues": [ 
    { 
     "key": "wiiDcsQ5pdQ", 
     "value": "25" 
    }, 
    { 
     "key": "RsZ4gQzWPWU", 
     "value": "null" 
    }, 
    { 
     "key": "L7aO70bcrbP", 
     "value": "" 
    }, 
    { 
     "key": "gY6pXRwdThm", 
     "value": null 
    }, 
    { 
     "key": "x1708y0C4C7", 
     "value": false 
    } 
    ] 
}""" 

In [14]: data = json.loads(json_text) 

In [15]: ignored_values = set(["null", "", None]) 

In [16]: [elem for elem in data['dataValues'] if elem['value'] not in ignored_values] 
Out[16]: 
[{u'key': u'wiiDcsQ5pdQ', u'value': u'25'}, 
{u'key': u'x1708y0C4C7', u'value': False}] 
+2

Незначительное примечание: если это современный Python (Py3.2 или выше), вы можете получить небольшую скорость, избегая создания имени 'ignored_vals' 'set' при каждом использовании такой функции, вместо того, чтобы Python загружал константу' frozenset', делая: '[elem для elem в data ['dataValues'], если elem ['value'] не находится в {" null ", "", None}] '[Оптимизатор подглядывания был обновлен, чтобы распознавать тесты на членство в литературе' set' литералов Python и преобразовывает его в константный 'frozenset' один раз в момент компиляции кода байта, а затем повторно использует его бесплатно после этого. ] (https://docs.python.org/3/whatsnew/3.2.html#optimizations) – ShadowRanger

+0

@ShadowRanger Это интересный лакомый кусочек, спасибо за обмен. –

1

Я думаю, что это то, что вы хотите;

ignored_values = ['null', '', None] 
data_values = event['dataValues'] 

In [36]: event['dataValues'] = filter(lambda x: x['value'] not in ignored_values, data_values) 
In [37]: event 
Out[37]: 
{'dataValues': [{'key': 'wiiDcsQ5pdQ', 'value': '25'}, 
    {'key': 'x1708y0C4C7', 'value': False}], 
'status': 'COMPLETED'} 
Смежные вопросы