In order to filter list of dictionaries from empty values I need to remove ~30% of data from dictionaries.
So I've end up with this code:
qr = query_result
for row in qr:
for key, value in row.items():
if value ==' ' or value == None, value == '':
del row[key]
However, there is an error during execution at first delete attempt:
RuntimeError: dictionary changed size during iteration
After a bit of search on stackoverflow I've found solution, that involves copying all deleted values to separate list for subsequent deletion.
delete = []
for k,v in dict.items():
if v%2 == 1:
delete.append(k)
for i in delete:
del dict[i]
This, approach, transforms into such code for my case:
qr = query_result
for row in qr:
delete = []
for key, value in row.items():
if value == ' ' or value == '' or value == None:
delete.append(key)
for i in delete:
del row[i]
which is also suffers from certain RuntimeError
.
Thus, delete loop should be outside dict foreach loop:
qr = query_result
for row in qr:
delete = []
for key, value in row.items():
if value == ' ' or value == '' or value == None:
delete.append(key)
for i in delete:
del row[i]
But given code, unfortunately, modifies correctly only last row.
How do I process all rows and then delete garbage data?
Here is some data for testing:
c = [{'A': 'B', 'C': '3', 'EE': None, 'P': '343', 'AD': ' ', 'B': ''},
{'A': 'B', 'C': '3', 'EE': None, 'P': '343', 'AD': ' ', 'B': ''}]
My output:
{'A': 'B', 'C': '3', 'EE': None, 'P': '343', 'AD': ' ', 'B': ''}
{'A': 'B', 'C': '3', 'P': '343'}
Desired output:
{'A': 'B', 'C': '3', 'P': '343'}
{'A': 'B', 'C': '3', 'P': '343'}