Home > other >  create a specific python dictionary from 2 lists
create a specific python dictionary from 2 lists

Time:03-16

I have the following data:

fsm_header = ['VLAN_ID', 'NAME', 'STATUS']
fsm_results = [['1', 'default', 'active'],
               ['2', 'VLAN0002', 'active'],
               ['3', 'VLAN0003', 'active']]

I want to create a specific dictionary like this:

{'VLAN_ID':['1','2','3'],
 'NAME':['default','VLAN0002','VLAN0003'],
 'STATUS':['active','active','active']}

I'm having trouble finding the right combination, as the one I'm using:

dict(zip(fsm_header, row)) for row in fsm_results 

gives me another type of useful output, but not the one I mentioned above.

I would prefer to see something without using the zip function, but even with zip is ok.

CodePudding user response:

You need to unpack and zip fsm_results too:

out = {k:list(v) for k,v in zip(fsm_header, zip(*fsm_results))}

Output:

{'VLAN_ID': ['1', '2', '3'],
 'NAME': ['default', 'VLAN0002', 'VLAN0003'],
 'STATUS': ['active', 'active', 'active']}

If you don't mind tuple as values; then you could use:

out = dict(zip(fsm_header, zip(*fsm_results)))

Output:

{'VLAN_ID': ('1', '2', '3'),
 'NAME': ('default', 'VLAN0002', 'VLAN0003'),
 'STATUS': ('active', 'active', 'active')}

You could also write the same thing using dict.setdefault:

out = {}
for lst in fsm_results:
    for k, v in zip(fsm_header, lst):
        out.setdefault(k, []).append(v)

CodePudding user response:

An alternative option would to use numpy to transpose the values:

>>> import numpy as np
>>> dict(zip(fsm_header, np.array(fsm_results).T.tolist()))
{'VLAN_ID': ['1', '2', '3'],
 'NAME': ['default', 'VLAN0002', 'VLAN0003'],
 'STATUS': ['active', 'active', 'active']}
  • Related