Reputation: 98921
Is there a more elegant way in python
to create a dictionary
from a list
and a cs line
besides a loop?
my_master_list = ["ABC", "DEF", "GHI"]
my_list = ["field1", "field2", "field3"]
my_line = "test1,test2,test3"
my_dict = {}
for x in my_master_list:
my_dict[x] = {}
line_parts = my_line.split(",")
n = 0
for y in my_list:
my_dict[x][y] = line_parts[n]
n +=1
print my_dict
# {'ABC': {'field2': 'test2', 'field3': 'test3', 'field1': 'test1'}, 'GHI': {'field2': 'test2', 'field3': 'test3', 'field1': 'test1'}, 'DEF': {'field2': 'test2', 'field3': 'test3', 'field1': 'test1'}}
Upvotes: 1
Views: 1988
Reputation: 8614
d = {x:dict(zip(my_list, my_line.split(','))) for x in my_master_list}
^ ^ ^
| | [1]--- creates a list from the string
| |
| [2]--- creates a tuple from two lists
|
[3]--- creates a dictionary from the tuples (key, value)
^
|
[4] The overall expression is a dictionary comprehension.
Read about dict comprehensions in PEP274.
Upvotes: 3
Reputation: 214957
You can use zip
with a dictionary comprehension:
# construct the inner dictionary
d = dict(zip(my_list, my_line.split(",")))
# construct the outer dictionary, if you don't want to make copies, you can use
# {master_key: d ... } directly here just keep in mind they are referring to the same
# object in this way
{master_key: d.copy() for master_key in my_master_list}
#{'ABC': {'field1': 'test1', 'field2': 'test2', 'field3': 'test3'},
# 'DEF': {'field1': 'test1', 'field2': 'test2', 'field3': 'test3'},
# 'GHI': {'field1': 'test1', 'field2': 'test2', 'field3': 'test3'}}
Upvotes: 5