pythonpython-3.xdictionary

Python dictonary convert keys to values and vice versa


I need to convert keys to values and values to key.. i am using python 2.7 version... if there is any better approach then this let me know

source_info=\
    {'benz':   'car',
     'audi':   'car',
     'bmw':    'car',
     'toyata': 'car',
     'ferrai': 'car',
     'ducati': 'bike',
     'suzki':  'bike',
     'yamaha': 'bike'
     }

def format_data(source_info=None):
   # {} converting to set
   id_unique = {source_info[key_id] for key_id in source_info}
   result_dict = {}
   # Result data from seq_def with searching for key with algos
   for key in id_unique:
    vechile_name = {k: v for k, v in source_info.items() if v in [key]}
    result_dict[key] = list(vechile_name.keys())
   return result_dict

result = format_data(source_info)
print(result)

I'm using the above code to get my job done.. but wanted to know if there is any better approach then this ?

result looks like this:

{'bike': ['ducati', 'suzki', 'yamaha'], 'car': ['benz', 'audi', 'bmw', 'toyata', 'ferrai']}

Highly appreciate your inputs here...


Solution

  • Readily accomplished with collections.defaultdict.

    >>> source_info=\
    ...     {'benz':   'car',
    ...      'audi':   'car',
    ...      'bmw':    'car',
    ...      'toyata': 'car',
    ...      'ferrai': 'car',
    ...      'ducati': 'bike',
    ...      'suzki':  'bike',
    ...      'yamaha': 'bike'
    ...      }
    >>> from collections import defaultdict
    >>> d = defaultdict(list)
    >>> for k, v in source_info.items():
    ...     d[v].append(k)
    ...
    >>> d
    defaultdict(<type 'list'>, {'car': ['toyata', 'ferrai', 'bmw', 'benz', 'audi'], 'bike': ['suzki', 'yamaha', 'ducati']})
    >>> dict(d)
    {'car': ['toyata', 'ferrai', 'bmw', 'benz', 'audi'], 'bike': ['suzki', 'yamaha', 'ducati']}
    

    You might also use a call to itertools.groupby.

    from itertools import groupby
    from operator import itemgetter
    
    source_info = {
        'benz':   'car',
        'audi':   'car',
        'bmw':    'car',
        'toyata': 'car',
        'ferrai': 'car',
        'ducati': 'bike',
        'suzki':  'bike',
        'yamaha': 'bike'
    }
    
    grouped = {
        k: [b for b, _ in v]
        for k, v in groupby(source_info.items(), key=itemgetter(1))
    }