我正在处理字典列表,我正在尝试验证这些字典中的哪些键包含空值。我拥有的数据结构如下:
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_format
和ending_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'
答案 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')=='')})