如何确定Python字典中是否缺少某些字段?

时间:2017-09-07 18:57:48

标签: python python-3.x dictionary

我正在处理字典列表,我正在尝试验证这些字典中的哪些键包含空值。我拥有的数据结构如下:

filtered_data = 
[{'id': 1021972, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.94', 'Aging_Un_investigated_Issue': '0.94', 'User': 'John P.', 'ModifiedOn': '2017-09-04 21:29:59', 'Open_date':'2017-08-04 01:34:18', 'End_date': '2017-09-05 00:29:01', 'Ticket_status':'Transferred'},
 {'id': 1036722, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.12', 'Aging_Un_investigated_Issue': '0.01', 'User': 'John P.', 'ModifiedOn': '2017-09-04 21:29:59', 'Open_date':'2017-09-01 00:34:18', 'End_date': '', 'Ticket_status':'Researching'},
 {'id': 1015621, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.99', 'Aging_Un_investigated_Issue': '0.11', 'User': 'John D.', 'ModifiedOn': '2017-06-05 12:19:59', 'Open_date':'2017-01-01 00:00:18', 'End_date': '2017-09-01 20:20:57', 'Ticket_status':'Closed'}]

我想验证它们是否包含数据的必需键如下:

mandatory_keys = ['id','User','Ticket_status']

目前我有这段代码从列表中读取每个字典,并仅附加在beginning_date_formatending_date_format之间包含Open_date的字典。

list_data = []
for d in filtered_data:
    list_data.append({k: d[k] for k in mandatory_keys if beginning_date_format
                                          <= dateutil.parser.parse(d.get('Open_date'))
                                          < ending_date_format})

我想在开始日期和结束日期之间添加 Open_date 的字典,以及来自mandatory_keys的任何键都不包含值 {{ 1}}。

如何实施我的解决方案?欢迎任何想法,意见和建议。

编辑:

" "

编辑:

这是我找到的解决方案。

beginning_date_format = '2017-08-01 00:00:00' 
ending_date_format = '2017-09-05 00:29:01'

基于Return none if dictionary key is not available

3 个答案:

答案 0 :(得分:0)

我一直在努力理解你的问题和评论中的对话的要求。据我所见,这可以满足您的要求。

import datetime as dt

filtered_data = [{'id': 1021972, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.94', 'Aging_Un_investigated_Issue': '0.94', 'User': 'John P.', 'ModifiedOn': '2017-09-04 21:29:59', 'Open_date':'2017-08-04 01:34:18', 'End_date': '2017-09-05 00:29:01', 'Ticket_status':'Transferred'},
 {'id': 1036722, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.12', 'Aging_Un_investigated_Issue': '0.01', 'User': 'John P.', 'ModifiedOn': '2017-09-04 21:29:59', 'Open_date':'2017-09-01 00:34:18', 'End_date': '', 'Ticket_status':'Researching'},
 {'id': 1015621, 'Aging_Deferred_Transferred': '', 'Aging_Open_Issue': '0.99', 'Aging_Un_investigated_Issue': '0.11', 'User': 'John D.', 'ModifiedOn': '2017-06-05 12:19:59', 'Open_date':'2017-01-01 00:00:18', 'End_date': '2017-09-01 20:20:57', 'Ticket_status':'Closed'}]

beginning_date_format = dt.datetime.strptime('2017-08-01 00:00:00',
                                             '%Y-%m-%d %H:%M:%S')
ending_date_format = dt.datetime.strptime('2017-09-05 00:29:01',
                                          '%Y-%m-%d %H:%M:%S')

list_data = []
for d in filtered_data:
    if not d.get('Open_date'): # I'm unsure about this. Remove if not desired.
        list_data.append([d['id'], d['User'], d['Ticket_status']])
    elif (beginning_date_format
          < dt.datetime.strptime(d['Open_date'], '%Y-%m-%d %H:%M:%S')
          < ending_date_format):
        list_data.append([d['id'], d['User'], d['Ticket_status']])

编辑: 这个问题在如此短的时间内被编辑了很多次,我认为这个答案只能作为一个例子。它仍然会检查空字段。

答案 1 :(得分:0)

bad_data = []
for d in filtered_data:
    try:

        dt = d['Open_date']
        if dt and not all([ d[k] for k in mandatory]) and ( beginning_date_format
                                      <= dt 
                                      < ending_date_format):
            bad_data.append(d))
    except Exception, e:
        logging.exception('some problem', exc_info=True)

请注意。像这样的例外情况是不好的做法只是希望你得到一个清单,即使没有开放日期密钥,或只是使用你的获取。但是请注意,与Python 3中的None相比,workaraound可能是.get('Open_date','1940 ....')

答案 2 :(得分:0)

这是解决我问题的解决方案:

list_data = []
for d in filtered_data:
    list_data.append({k: d[k] for k in mandatory_keys if beginning_date_format <= 
    dateutil.parser.parse(d.get('Open_date')) < ending_date_format and (d.get('id')=='' 
    or d.get('User')=='' or d.get('Ticket_status')=='')})