Optimized, Tested with 72 million records produced in 41 seconds
For your completely blank [{}] * 900000 example, it finished in 0.42 seconds:
from itertools import chain
from pprint import pprint
from time import time
def make_record(name: str,
exam: str='NA',
grade: str='NA',
age: str='NA',
subject: str='NA') -> dict:
return {'Name': name,
'Exam': exam,
'Grade': grade,
'age': age,
'subject': subject}
def fix_record(data: dict) -> list:
new_data = []
name = data.get('Name', 'NA')
students = data.get('Student', [])
if students:
for student in students:
exam = student.get('Exam', 'NA')
grade = student.get('Grade', 'NA')
classes = student.get('class', [])
if classes:
for c in classes:
age = c.get('age', 'NA')
subject = c.get('subject', 'NA')
new_data.append(make_record(name, exam, grade, age, subject))
else:
new_data.append(make_record(name, exam, grade))
else:
new_data.append(make_record(name))
return new_data
list_ = [
{'Name': 'Paras Jain',
'Student': [{'Exam': 90,
'Grade': 'a',
'class': [{'age': 10, 'subject': 'hindi'},
{'age': 11, 'subject': 'maths'}]},
{'Exam': 99,
'Grade': 'b',
'class': [{'age': 14, 'subject': 'evs'},
{'age': 15, 'subject': 'science'}]},
{'Exam': 97,
'Grade': 'c',
'class': [{'age': 10, 'subject': 'history'}]}]},
{'Name': 'Chunky Pandey',
'Student': [{'Exam': 89,
'Grade': 'a',
'class': [{'age': 9, 'subject': 'no'}]},
{'Exam': 80, 'Grade': 'b', 'class': []}]},
{'Name': 'abc', 'Student':[]}
]
list_ *= 9e6
if __name__ == '__main__':
start = time()
list_ = list(chain.from_iterable(map(fix_record, list_)))
print(f'{time()-start:.2f} seconds')
print('Total Records: ', len(list_))
print('First 10 Records:')
pprint(list_[:10], width=150)
list2 = [{}] * 9e6
start = time()
list2 = list(chain.from_iterable(map(fix_record, list2)))
print(f'{time()-start:.2f} seconds')
pprint(list2[:10], width=150)
Output:
41.02 seconds
Total Records: 72000000
First 10 Records:
[{'Exam': 90, 'Grade': 'a', 'Name': 'Paras Jain', 'age': 10, 'subject': 'hindi'},
{'Exam': 90, 'Grade': 'a', 'Name': 'Paras Jain', 'age': 11, 'subject': 'maths'},
{'Exam': 99, 'Grade': 'b', 'Name': 'Paras Jain', 'age': 14, 'subject': 'evs'},
{'Exam': 99, 'Grade': 'b', 'Name': 'Paras Jain', 'age': 15, 'subject': 'science'},
{'Exam': 97, 'Grade': 'c', 'Name': 'Paras Jain', 'age': 10, 'subject': 'history'},
{'Exam': 89, 'Grade': 'a', 'Name': 'Chunky Pandey', 'age': 9, 'subject': 'no'},
{'Exam': 80, 'Grade': 'b', 'Name': 'Chunky Pandey', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'abc', 'age': 'NA', 'subject': 'NA'},
{'Exam': 90, 'Grade': 'a', 'Name': 'Paras Jain', 'age': 10, 'subject': 'hindi'},
{'Exam': 90, 'Grade': 'a', 'Name': 'Paras Jain', 'age': 11, 'subject': 'maths'}]
0.42 seconds
[{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'},
{'Exam': 'NA', 'Grade': 'NA', 'Name': 'NA', 'age': 'NA', 'subject': 'NA'}]