How to make a dictionary of dictionaries with multiple lists

There is one index list that will be the key of the parent dictionary:

index = [1,2,3] 

and then some lists from which will be child dicts:

 triangles = [4,5,6] circles = [7,8,9] squares = [10,11,12] 

sequential elements are data, resulting in:

 {1:{'triangles':4, 'circles':7, 'squares': 10}, 2: {'triangles': 5, 'circles': 8, 'squares': 11}, 3: {'triangles': 6, 'circles': 9, 'squares': 12}} 

How can i do this?

Do you find it easier to do in pandas?

+5
source share
7 answers

You can zip create lists, create subtitles, and then index indexes with indexes. No restrictions by indices; they may be non-sequential / non-numerical:

 dct = dict(zip(index, ({'triangles': i, 'circles': j, 'squares': k} for i,j,k in zip(triangles, circles, squares)))) print(dct) 

 {1: {'circles': 7, 'squares': 10, 'triangles': 4}, 2: {'circles': 8, 'squares': 11, 'triangles': 5}, 3: {'circles': 9, 'squares': 12, 'triangles': 6}} 

In another note, if you only need sequential calculations, you can replace the index list with enumerate :

 dct = dict(enumerate(({'triangles': i, 'circles': j, 'squares': k} for i,j,k in zip(triangles, circles, squares)), 1)) 
+4
source

Dictations for salvation!
Note BTW that the indexes stored in index seem to be unidirectional, although python lists are based on a null value:

 result = {i : {'triangles' : triangles[i-1], 'circles' : circles[i-1], 'squares' : squares[i-1]} for i in index} 
+1
source

The easiest way is dict comprehension :

 >>> d = {i:{'triangles':triangles[i-1],'circles':circles[i-1],'squares':squares[i-1]} for i in index} {1: {'circles': 7, 'squares': 10, 'triangles': 4}, 2: {'circles': 8, 'squares': 11, 'triangles': 5}, 3: {'circles': 9, 'squares': 12, 'triangles': 6}} 
+1
source

This is actually very easy and can be achieved with a simple for -loop:

 index = [1,2,3] triangles = [4,5,6] circles = [7,8,9] squares = [10,11,12] dictionary = {} for i in range(0, len(index)): dictionary[index[i]] = {'triangles':triangles[i], 'circles':circles[i], 'squares':squares[i]} print(dictionary) 

Output:

{1: {'triangles': 4,' circles': 7, 'squares': 10}, 2: {' triangles': 5, 'circles': 8,' squares': 11}, 3: {'triangles ': 6,' circles': 9, 'squares': 12}}

0
source

You can do something like this,

 results = {} for index, item in enumerate(zip(triangles,circles,squares)): results.update({index+1:{'triangles':item[0], 'circles':item[1], 'squares':item[2]}}) Out[6]: {1: {'circles': 7, 'squares': 10, 'triangles': 4}, 2: {'circles': 8, 'squares': 11, 'triangles': 5}, 3: {'circles': 9, 'squares': 12, 'triangles': 6}} 
0
source

If you have a lot of variables and don’t want to hard code the dictionary understanding, here is the way.

NOTE: you need to declare all variables.

You also need to declare a list of variable names.

 list_of_var_names = ['triangles', 'circles', 'squares'] dict(zip(index, [dict(zip(list_of_var_names, i)) for i in (globals().get(i) for i in list_of_var_names)])) 

And split step by step:

 In [1]: index = [1,2,3] ...: ...: triangles = [4,5,6] ...: circles = [7,8,9] ...: squares = [10,11,12] ...: In [2]: list_of_var_names = ['triangles', 'circles', 'squares'] In [3]: [globals().get(i) for i in list_of_var_names] # getting list of variable values in list_of_var_names order Out[3]: [[4, 5, 6], [7, 8, 9], [10, 11, 12]] In [4]: [dict(zip(list_of_var_names, i)) for i in (globals().get(i) for i in lis ...: t_of_var_names)] Out[4]: [{'circles': 5, 'squares': 6, 'triangles': 4}, {'circles': 8, 'squares': 9, 'triangles': 7}, {'circles': 11, 'squares': 12, 'triangles': 10}] In [5]: dict(zip(index, [dict(zip(list_of_var_names, i)) ...: for i in (globals().get(i) for i in list_of_var_names)] ...: )) ...: Out[5]: {1: {'circles': 5, 'squares': 6, 'triangles': 4}, 2: {'circles': 8, 'squares': 9, 'triangles': 7}, 3: {'circles': 11, 'squares': 12, 'triangles': 10}} 

I want to mention once again that this solution, if it is good, if you get a lot of variables, and you do not want to explicitly declare your understanding of the dict. In other cases, it would be more appropriate and more readable to use the other solutions presented here.

0
source

Another sort using double zip() and dict comprehension :

 triangles = [4,5,6] circles = [7,8,9] squares = [10,11,12] index = [1,2,3] b = {k:{'triangles': x, 'circles': y, 'squares': z} for k, (x,y,z) in zip( index, zip(triangles, circles, squares))} print(b) 

Output:

 {1: {'circles': 7, 'squares': 10, 'triangles': 4}, 2: {'circles': 8, 'squares': 11, 'triangles': 5}, 3: {'circles': 9, 'squares': 12, 'triangles': 6}} 
0
source

Source: https://habr.com/ru/post/1268832/


All Articles