0

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...

Chris
  • 26,361
  • 5
  • 21
  • 42
kumar Raj
  • 13
  • 8
  • Does this answer your question? [Reverse a dictionary to key : list of values?](https://stackoverflow.com/questions/44851342/reverse-a-dictionary-to-key-list-of-values) – mkrieger1 May 14 '23 at 06:28

4 Answers4

4

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']}
Chris
  • 26,361
  • 5
  • 21
  • 42
1

use dictionary comprehension to convert keys to values and values to keys. I've provided code as below.

To convert keys to values:

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

result_dict = {v: k for k, v in source_info.items()}

print(result_dict)

output like this: {'car': 'ferrai', 'bike': 'yamaha'}

To convert values to keys:

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

result_dict = {k: [i for i in source_info.keys() if source_info[i] == k] for k in set(source_info.values())}

print(result_dict)

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

let me know if you face any issue.

Hari pootar
  • 147
  • 3
1

You can use dict built in functionality setdefault

results = {}
for k, v in source_info.items():
    results.setdefault(v, []).append(k)

Output

{'car': ['benz', 'audi', 'bmw', 'toyata', 'ferrai'], 'bike': ['ducati', 'suzki', 'yamaha']}
Guy
  • 46,488
  • 10
  • 44
  • 88
0
from itertools import groupby
from operator import itemgetter

{
    k: list(map(itemgetter(0), v))
    for k, v in groupby(sorted(source_info.items(), key=itemgetter(1)), itemgetter(1))
}

#output
{'bike': ['ducati', 'suzki', 'yamaha'],
 'car': ['benz', 'audi', 'bmw', 'toyata', 'ferrai']}
Talha Tayyab
  • 8,111
  • 25
  • 27
  • 44