tc_qa
tc_qa

Reputation: 37

Python list of lists conversion into dictionary

I'm trying to convert a list of lists into dictionary, but I'm getting troubles. Would anyone give some tips ?

This my input:

[['Column1', 'Column2', 'Column3', 'Column4', 'Column5'],     
['Value1Column1', 'Value1Column2', 'Value1Column3', 'Value1Column4',   
'Value1Column5'], ['Value2Column1', 'Value2Column2', 'Value2Column3', 
'Value2Column4', 'Value2Column5'], ..., 
['ValueXColumn1','ValueXColumn2', 'ValueXColumn3', 'ValueXColumn4', 'ValueXColumn5']]

Having this I would like to create a dictionary, where my keys would be only elements from 1st list which are Column1, Column2...Column5.

It's also known that for each key exact value is element from the rest of lists:

Column1 --> Value1Column1, Value2Column1...

Column2 --> Value1Column2, Value2Column2...

Expected result:

"Column1": ["Value1Column1", "Value2Column1"...]

I've been trying with zip, enumurate (maybe wrongly used) and got always unexpected output. Thanks!

Upvotes: 0

Views: 83

Answers (3)

Łukasz Rogalski
Łukasz Rogalski

Reputation: 23223

It's really simple with dict comprehension and zip function.

seq_of_seq = [['Column1', 'Column2', 'Column3', 'Column4', 'Column5'],
              ['Value1Column1', 'Value1Column2', 'Value1Column3', 'Value1Column4', 'Value1Column5'],
              ['Value2Column1', 'Value2Column2', 'Value2Column3', 'Value2Column4', 'Value2Column5'],
              ['ValueXColumn1', 'ValueXColumn2', 'ValueXColumn3', 'ValueXColumn4', 'ValueXColumn5']]

d = {s[0]: s[1:] for s in zip(*seq_of_seq)}

This yields values as tuples:

{'Column1': ('Value1Column1', 'Value2Column1', 'ValueXColumn1'),
 'Column2': ('Value1Column2', 'Value2Column2', 'ValueXColumn2'),
 'Column3': ('Value1Column3', 'Value2Column3', 'ValueXColumn3'),
 'Column4': ('Value1Column4', 'Value2Column4', 'ValueXColumn4'),
 'Column5': ('Value1Column5', 'Value2Column5', 'ValueXColumn5')}

If you really need lists use:

d = {s[0]: list(s[1:]) for s in zip(*seq_of_seq)}

Result:

{'Column1': ['Value1Column1', 'Value2Column1', 'ValueXColumn1'],
 'Column2': ['Value1Column2', 'Value2Column2', 'ValueXColumn2'],
 'Column3': ['Value1Column3', 'Value2Column3', 'ValueXColumn3'],
 'Column4': ['Value1Column4', 'Value2Column4', 'ValueXColumn4'],
 'Column5': ['Value1Column5', 'Value2Column5', 'ValueXColumn5']}

Upvotes: 4

deceze
deceze

Reputation: 522101

This is the verbose, but straight forward version:

from collections import defaultdict

keys = lst[0]
rows = lst[1:]
result = defaultdict(list)

for row in rows:
    for key, value in zip(keys, row):
        result[key].append(value)

Upvotes: 1

Mathias711
Mathias711

Reputation: 6658

a = [['Column1', 'Column2', 'Column3', 'Column4', 'Column5'], ['Value1Column1', 'Value1Column2', 'Value1Column3', 'Value1Column4', 'Value1Column5'], ['Value2Column1', 'Value2Column2', 'Value2Column3', 'Value2Column4', 'Value2Column5']]

[{a[0][i]: [j[i] for j in a[1:]] for i in range(len(a[0]))}]

gives

[{'Column1': ['Value1Column1', 'Value2Column1'],
  'Column2': ['Value1Column2', 'Value2Column2'],
  'Column3': ['Value1Column3', 'Value2Column3'],
  'Column4': ['Value1Column4', 'Value2Column4'],
  'Column5': ['Value1Column5', 'Value2Column5']}]

Upvotes: 0

Related Questions