First, let's make it easy to look up a company by name, by building a dict:
companies = {record['companyName']:record for record in array}
companies looks like this:
{'HARRODS LIMITED': {'companyName': 'HARRODS LIMITED',
'companyNo': '00030209',
'parentCompanyNo': 'PRIMARY',
'parentCompanyName': 'PRIMARY'},
'Harrods (Uk) Limited': {'companyNo': '01889348',
'companyName': 'Harrods (Uk) Limited',
'parentCompanyNo': '00030209',
'parentCompanyName': 'HARRODS LIMITED'},
'Harrods Holdings Limited': {'companyNo': '01848143',
'companyName': 'Harrods Holdings Limited',
'parentCompanyNo': '01889348',
'parentCompanyName': 'Harrods (Uk) Limited'},
'Qh Partners Limited': {'companyNo': '05961740',
'companyName': 'Qh Partners Limited',
'parentCompanyNo': '01848143',
'parentCompanyName': 'Harrods Holdings Limited'},
'Qh Participations Limited': {'companyNo': '06511479',
'companyName': 'Qh Participations Limited',
'parentCompanyNo': '05961740',
'parentCompanyName': 'Qh Partners Limited'},
'Harrods Group (Holding) Limited': {'companyNo': '05990648',
'companyName': 'Harrods Group (Holding) Limited',
'parentCompanyNo': '06511479',
'parentCompanyName': 'Qh Participations Limited'},
'Qatar Investment Authority': {'companyNo': 'Not Applicable',
'companyName': 'Qatar Investment Authority',
'parentCompanyNo': '05990648',
'parentCompanyName': 'Harrods Group (Holding) Limited'}}
Second, go through the dict items. If the parent listed in a company record is in the dict, then add the company record to the 'children' field of the parent company record. Also, keep track of which companies are children in the set 'is_child'.
is_child = set()
for company, record in companies.items():
parent = record['parentCompanyName']
if parent in companies:
children = companies[parent].setdefault('children', list())
children.append(record)
is_child.add(company)
companies now looks like:
({'HARRODS LIMITED': {'companyName': 'HARRODS LIMITED',
'companyNo': '00030209',
'parentCompanyNo': 'PRIMARY',
'parentCompanyName': 'PRIMARY',
'children': [{'companyNo': '01889348',
'companyName': 'Harrods (Uk) Limited',
'parentCompanyNo': '00030209',
'parentCompanyName': 'HARRODS LIMITED',
'children': [{'companyNo': '01848143',
'companyName': 'Harrods Holdings Limited',
'parentCompanyNo': '01889348',
'parentCompanyName': 'Harrods (Uk) Limited',
'children': [{'companyNo': '05961740',
'companyName': 'Qh Partners Limited',
'parentCompanyNo': '01848143',
'parentCompanyName': 'Harrods Holdings Limited',
'children': [{'companyNo': '06511479',
'companyName': 'Qh Participations Limited',
'parentCompanyNo': '05961740',
'parentCompanyName': 'Qh Partners Limited',
'children': [{'companyNo': '05990648',
'companyName': 'Harrods Group (Holding) Limited',
'parentCompanyNo': '06511479',
'parentCompanyName': 'Qh Participations Limited',
'children': [{'companyNo': 'Not Applicable',
'companyName': 'Qatar Investment Authority',
'parentCompanyNo': '05990648',
'parentCompanyName': 'Harrods Group (Holding) Limited'}]}]}]}]}]}]},
'Harrods (Uk) Limited': {'companyNo': '01889348',
'companyName': 'Harrods (Uk) Limited',
'parentCompanyNo': '00030209',
'parentCompanyName': 'HARRODS LIMITED',
'children': [{'companyNo': '01848143',
'companyName': 'Harrods Holdings Limited',
'parentCompanyNo': '01889348',
'parentCompanyName': 'Harrods (Uk) Limited',
'children': [{'companyNo': '05961740',
'companyName': 'Qh Partners Limited',
'parentCompanyNo': '01848143',
'parentCompanyName': 'Harrods Holdings Limited',
'children': [{'companyNo': '06511479',
'companyName': 'Qh Participations Limited',
'parentCompanyNo': '05961740',
'parentCompanyName': 'Qh Partners Limited',
'children': [{'companyNo': '05990648',
'companyName': 'Harrods Group (Holding) Limited',
'parentCompanyNo': '06511479',
'parentCompanyName': 'Qh Participations Limited',
'children': [{'companyNo': 'Not Applicable',
'companyName': 'Qatar Investment Authority',
'parentCompanyNo': '05990648',
'parentCompanyName': 'Harrods Group (Holding) Limited'}]}]}]}]}]},
'Harrods Holdings Limited': {'companyNo': '01848143',
'companyName': 'Harrods Holdings Limited',
'parentCompanyNo': '01889348',
'parentCompanyName': 'Harrods (Uk) Limited',
'children': [{'companyNo': '05961740',
'companyName': 'Qh Partners Limited',
'parentCompanyNo': '01848143',
'parentCompanyName': 'Harrods Holdings Limited',
'children': [{'companyNo': '06511479',
'companyName': 'Qh Participations Limited',
'parentCompanyNo': '05961740',
'parentCompanyName': 'Qh Partners Limited',
'children': [{'companyNo': '05990648',
'companyName': 'Harrods Group (Holding) Limited',
'parentCompanyNo': '06511479',
'parentCompanyName': 'Qh Participations Limited',
'children': [{'companyNo': 'Not Applicable',
'companyName': 'Qatar Investment Authority',
'parentCompanyNo': '05990648',
'parentCompanyName': 'Harrods Group (Holding) Limited'}]}]}]}]},
'Qh Partners Limited': {'companyNo': '05961740',
'companyName': 'Qh Partners Limited',
'parentCompanyNo': '01848143',
'parentCompanyName': 'Harrods Holdings Limited',
'children': [{'companyNo': '06511479',
'companyName': 'Qh Participations Limited',
'parentCompanyNo': '05961740',
'parentCompanyName': 'Qh Partners Limited',
'children': [{'companyNo': '05990648',
'companyName': 'Harrods Group (Holding) Limited',
'parentCompanyNo': '06511479',
'parentCompanyName': 'Qh Participations Limited',
'children': [{'companyNo': 'Not Applicable',
'companyName': 'Qatar Investment Authority',
'parentCompanyNo': '05990648',
'parentCompanyName': 'Harrods Group (Holding) Limited'}]}]}]},
'Qh Participations Limited': {'companyNo': '06511479',
'companyName': 'Qh Participations Limited',
'parentCompanyNo': '05961740',
'parentCompanyName': 'Qh Partners Limited',
'children': [{'companyNo': '05990648',
'companyName': 'Harrods Group (Holding) Limited',
'parentCompanyNo': '06511479',
'parentCompanyName': 'Qh Participations Limited',
'children': [{'companyNo': 'Not Applicable',
'companyName': 'Qatar Investment Authority',
'parentCompanyNo': '05990648',
'parentCompanyName': 'Harrods Group (Holding) Limited'}]}]},
'Harrods Group (Holding) Limited': {'companyNo': '05990648',
'companyName': 'Harrods Group (Holding) Limited',
'parentCompanyNo': '06511479',
'parentCompanyName': 'Qh Participations Limited',
'children': [{'companyNo': 'Not Applicable',
'companyName': 'Qatar Investment Authority',
'parentCompanyNo': '05990648',
'parentCompanyName': 'Harrods Group (Holding) Limited'}]},
'Qatar Investment Authority': {'companyNo': 'Not Applicable',
'companyName': 'Qatar Investment Authority',
'parentCompanyNo': '05990648',
'parentCompanyName': 'Harrods Group (Holding) Limited'}},
And is_child:
{'Harrods (Uk) Limited',
'Harrods Group (Holding) Limited',
'Harrods Holdings Limited',
'Qatar Investment Authority',
'Qh Participations Limited',
'Qh Partners Limited'})
Lastly, copy the company records from the dict to a new array, if they are not a child of some other company.
new_array
new_array = [record for company, record in companies.items()
if company not in is_child]
And new_array looks like:
[{'companyName': 'HARRODS LIMITED',
'companyNo': '00030209',
'parentCompanyNo': 'PRIMARY',
'parentCompanyName': 'PRIMARY',
'children': [{'companyNo': '01889348',
'companyName': 'Harrods (Uk) Limited',
'parentCompanyNo': '00030209',
'parentCompanyName': 'HARRODS LIMITED',
'children': [{'companyNo': '01848143',
'companyName': 'Harrods Holdings Limited',
'parentCompanyNo': '01889348',
'parentCompanyName': 'Harrods (Uk) Limited',
'children': [{'companyNo': '05961740',
'companyName': 'Qh Partners Limited',
'parentCompanyNo': '01848143',
'parentCompanyName': 'Harrods Holdings Limited',
'children': [{'companyNo': '06511479',
'companyName': 'Qh Participations Limited',
'parentCompanyNo': '05961740',
'parentCompanyName': 'Qh Partners Limited',
'children': [{'companyNo': '05990648',
'companyName': 'Harrods Group (Holding) Limited',
'parentCompanyNo': '06511479',
'parentCompanyName': 'Qh Participations Limited',
'children': [{'companyNo': 'Not Applicable',
'companyName': 'Qatar Investment Authority',
'parentCompanyNo': '05990648',
'parentCompanyName': 'Harrods Group (Holding) Limited'}]}]}]}]}]}]}]
Now, put it all in a nice little function:
def remapper(array):
companies = {record['companyName']:record for record in array}
is_child = set()
for company, record in companies.items():
parent = record['parentCompanyName']
if parent in companies:
children = companies[parent].setdefault('children', list())
children.append(record)
is_child.add(company)
return [record for company, record in companies.items()
if company not in is_child]
Qatar Investment Authority? And why doesn'tQh Participations Limitedappear in the tree?