0

How do I remap an array in Python?

My Array looks like this:

array = [
        {"companyName": "HARRODS LIMITED", 
        "companyNo": "00030209", 
        "parentCompanyNo": "PRIMARY", 
        "parentCompanyName": "PRIMARY"}, 
        {"companyNo": "01889348", 
        "companyName": "Harrods (Uk) Limited", 
        "parentCompanyNo": "00030209", 
        "parentCompanyName": "HARRODS LIMITED"}, 
        {"companyNo": "01848143", 
        "companyName": "Harrods Holdings Limited", 
        "parentCompanyNo": "01889348", 
        "parentCompanyName": "Harrods (Uk) Limited"}, 
        {"companyNo": "05961740", 
        "companyName": "Qh Partners Limited",
        "parentCompanyNo":"01848143", 
        "parentCompanyName": "Harrods Holdings Limited"}, 
        {"companyNo": "06511479", 
        "companyName": "Qh Participations Limited", 
        "parentCompanyNo": "01848143", 
        "parentCompanyName": "Harrods Holdings Limited"}, 
        {"companyNo": "06511479", 
        "companyName": "Qh Participations Limited", 
        "parentCompanyNo": "05961740", 
        "parentCompanyName": "Qh Partners Limited"}, 
        {"companyNo": "05990648", 
        "companyName": "Harrods Group (Holding) Limited",
        "parentCompanyNo":"06511479",
        "parentCompanyName": "Qh Participations Limited"}, 
        {"companyNo": "Not Applicable", 
        "companyName": "Qatar Investment Authority", 
        "parentCompanyNo": "05990648", 
        "parentCompanyName": "Harrods Group (Holding) Limited"}, 
        {"companyNo": "06511479", 
        "companyName": "Qh Participations Limited", 
        "parentCompanyNo": "05961740", 
        "parentCompanyName": "Qh Partners Limited"}
    ]

I want to change the array so the objects in the array become children if the companyName key and parentCompanyNo key match.

So it will look something like this:

[
    {"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"}
            ]}
        ]}
    ]}
]

This is the furthest I could get:

def looper(loop1, loopParent):
    for item in obj1:
        children('01889348', item)
        if str(item['parentCompanyNo']) == loopParent:

             item['children'] = [{'loopChildren': item}]

Thanks

6
  • Your solution may be quite different based on your needs. Is order important to maintain? Importantly, can children have children as well, or will it only be nested once? Commented Nov 1, 2019 at 21:52
  • Could there be more than one "top-level" company? Is that why you still want a list at the end? Commented Nov 1, 2019 at 21:52
  • @chet Yes there can be children of children of children etc. Thanks Commented Nov 1, 2019 at 22:13
  • @KarlKnechtel Yes - There is only 1 top level company - Thanks Commented Nov 1, 2019 at 22:13
  • @tbowden what happened to Qatar Investment Authority? And why doesn't Qh Participations Limited appear in the tree? Commented Nov 1, 2019 at 22:13

2 Answers 2

1

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]
Sign up to request clarification or add additional context in comments.

Comments

0

You can use recursion to solve this in-place, modifying the array until it only has one root element. This solution saves on memory, since it is only moving references around inside the same dictionaries you start with, only creating new lists to accomodate listing children where necessary:

array = [
        {"companyName": "HARRODS LIMITED",
        "companyNo": "00030209",
        "parentCompanyNo": "PRIMARY",
        "parentCompanyName": "PRIMARY"},
        {"companyNo": "01889348",
        "companyName": "Harrods (Uk) Limited",
        "parentCompanyNo": "00030209",
        "parentCompanyName": "HARRODS LIMITED"},
        {"companyNo": "01848143",
        "companyName": "Harrods Holdings Limited",
        "parentCompanyNo": "01889348",
        "parentCompanyName": "Harrods (Uk) Limited"},
        {"companyNo": "05961740",
        "companyName": "Qh Partners Limited",
        "parentCompanyNo":"01848143",
        "parentCompanyName": "Harrods Holdings Limited"},
        {"companyNo": "06511479",
        "companyName": "Qh Participations Limited",
        "parentCompanyNo": "01848143",
        "parentCompanyName": "Harrods Holdings Limited"},
        {"companyNo": "06511479",
        "companyName": "Qh Participations Limited",
        "parentCompanyNo": "05961740",
        "parentCompanyName": "Qh Partners Limited"},
        {"companyNo": "05990648",
        "companyName": "Harrods Group (Holding) Limited",
        "parentCompanyNo":"06511479",
        "parentCompanyName": "Qh Participations Limited"},
        {"companyNo": "Not Applicable",
        "companyName": "Qatar Investment Authority",
        "parentCompanyNo": "05990648",
        "parentCompanyName": "Harrods Group (Holding) Limited"},
        {"companyNo": "06511479",
        "companyName": "Qh Participations Limited",
        "parentCompanyNo": "05961740",
        "parentCompanyName": "Qh Partners Limited"}
    ]

def add_to_tree(parent_candidate, item):
    if item['parentCompanyNo'] == parent_candidate['companyNo']:
        parent_candidate.setdefault('children',[]).append(item)
        return True

    return any(add_to_tree(x, item) for x in parent_candidate.get('children'))

def remap(arr):
    root = next(x for x in arr if x['parentCompanyNo'] == 'PRIMARY')
    while len(arr)>1:
        curIndex = next(i for i in range(len(arr)) if arr[i]['parentCompanyNo'] != "PRIMARY")
        curItem = array.pop(curIndex)
        any(add_to_tree(x, curItem) for x in arr)

remap(array)
import pprint
pprint.pprint(array)
[{'children': [{'children': [{'children': [{'children': [{'children': [{'children': [{'companyName': 'Qatar '
                                                                                                     'Investment '
                                                                                                     'Authority',
                                                                                      'companyNo': 'Not '
                                                                                                   'Applicable',
                                                                                      'parentCompanyName': 'Harrods '
                                                                                                           'Group '
                                                                                                           '(Holding) '
                                                                                                           'Limited',
                                                                                      'parentCompanyNo': '05990648'}],
                                                                        'companyName': 'Harrods '
                                                                                       'Group '
                                                                                       '(Holding) '
                                                                                       'Limited',
                                                                        'companyNo': '05990648',
                                                                        'parentCompanyName': 'Qh '
                                                                                             'Participations '
                                                                                             'Limited',
                                                                        'parentCompanyNo': '06511479'}],
                                                          'companyName': 'Qh '
                                                                         'Participations '
                                                                         'Limited',
                                                          'companyNo': '06511479',
                                                          'parentCompanyName': 'Qh '
                                                                               'Partners '
                                                                               'Limited',
                                                          'parentCompanyNo': '05961740'},
                                                         {'companyName': 'Qh '
                                                                         'Participations '
                                                                         'Limited',
                                                          'companyNo': '06511479',
                                                          'parentCompanyName': 'Qh '
                                                                               'Partners '
                                                                               'Limited',
                                                          'parentCompanyNo': '05961740'}],
                                            'companyName': 'Qh Partners '
                                                           'Limited',
                                            'companyNo': '05961740',
                                            'parentCompanyName': 'Harrods '
                                                                 'Holdings '
                                                                 'Limited',
                                            'parentCompanyNo': '01848143'},
                                           {'companyName': 'Qh Participations '
                                                           'Limited',
                                            'companyNo': '06511479',
                                            'parentCompanyName': 'Harrods '
                                                                 'Holdings '
                                                                 'Limited',
                                            'parentCompanyNo': '01848143'}],
                              'companyName': 'Harrods Holdings Limited',
                              'companyNo': '01848143',
                              'parentCompanyName': 'Harrods (Uk) Limited',
                              'parentCompanyNo': '01889348'}],
                'companyName': 'Harrods (Uk) Limited',
                'companyNo': '01889348',
                'parentCompanyName': 'HARRODS LIMITED',
                'parentCompanyNo': '00030209'}],
  'companyName': 'HARRODS LIMITED',
  'companyNo': '00030209',
  'parentCompanyName': 'PRIMARY',
  'parentCompanyNo': 'PRIMARY'}]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.