Reputation: 37
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
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
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
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