Search code examples
pythondictionarynested-listslist-manipulation

Python Nested List manipulation


Hello all python developers, I was playing with python lists and Pandas library and am having a trouble in a list manipulation tasks. I want to merge all test_list[i][0] dictionary items into one nested list index, according to same state name at index 0 of each nested list.

Sample Input:

test_list= [['Alabama', {'Baldwin County': 182265}],
 ['Alabama', {'Barbour County': 27457}],
 ['Arkansas', {'Newton County': 8330}],
 ['Arkansas', {'Perry County': 10445}],
 ['Arkansas', {'Phillips County': 21757}],
 ['California', {'Madera County': 150865}],
 ['California', {'Marin County': 252409}],
 ['Colorado', {'Adams County': 441603}],
 ['Colorado', {'Alamosa County': 15445}],
 ['Colorado', {'Arapahoe County': 572003}]
]

Sample Output:

test_list1= [['Alabama', {'Baldwin County': 182265, 'Barbour County': 27457}],
 ['Arkansas', {'Newton County': 8330, 'Perry County': 10445, 'Phillips County': 21757}],
 ['California', {'Madera County': 150865, 'Marin County': 252409}],
 ['Colorado', {'Adams County': 441603, 'Alamosa County': 15445, 'Arapahoe County': 572003}]
]

I have tried many approaches to solve this but no success so far.I am a beginner python developer. Thanks for helping in advance.


Solution

  • Approach

    • Use collections.defaultdict as a way to group data by a common field (in this case, by state).

    • For each state, the defaultdict creates a new dict which is updated with the dict.update() method.

    • Turn the result back into a list with list applied to the dictionary's items (key/value pairs).

    Working code

    >>> from pprint import pprint
    >>> from collections import defaultdict
    >>> d = defaultdict(dict)
    >>> for state, info in test_list:
            d[state].update(info)
    
    >>> result = list(d.items())
    >>> pprint(result)
    [('Alabama', {'Baldwin County': 182265, 'Barbour County': 27457}),
     ('Arkansas',
      {'Newton County': 8330, 'Perry County': 10445, 'Phillips County': 21757}),
     ('California', {'Madera County': 150865, 'Marin County': 252409}),
     ('Colorado',
      {'Adams County': 441603, 'Alamosa County': 15445, 'Arapahoe County': 572003})]