2017-06-14 13 views
5

Jest jedna lista wskaźnik, który będzie kluczem słownika dominującej:Jak słownika słowników z wielu list

index = [1,2,3] 

a następnie wiele list z których będą dicts dziecko:

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

sekwencyjne elementy są dane wynikające z:

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

jak mogę Zrób to ?

Czy uważasz, że łatwiej zrobić w pandach?

+4

Powiedz nam, co próbowałem do tej pory? –

Odpowiedz

0

Właściwie to jest bardzo łatwe i może zostać osiągnięty za pomocą prostego 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) 

wyjścia:

{1: { 'trójkąty': 4, 'kółka': 7 , 'kwadraty': 10}, 2: {'trójkąty': 5, 'koła': 8, 'kwadraty': 11}, 3: {'trójkąty': 6, 'koła': 9, 'kwadraty': 12 }}

1

Dict comprehnesions na ratunek!
Uwaga, przy okazji, że wskaźniki zapisane w index wydają się być jedną oparte chociaż listy python są zera:

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

Można zrobić coś takiego,

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}} 
1

Najprostsza metoda jest z 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}} 
4

można zip list utwórz subdicts a następnie spakuj subdicts z wskaźniki. No ograniczenia dotyczące indeksów; mogą być non-sekwencyjnego/non-numeryczne:

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}} 

Na innym uwaga, jeśli trzeba tylko liczy sekwencyjnych, lista indeksu można zastąpić enumerate:

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

to naprawdę gotowe rozwiązanie :) + jedna najsilniejsza odpowiedź od Sir –

+1

. :) – Haranadh

0

Jeśli masz dużo zmiennych i nie chcesz, aby kodowanie ze słownika było trudne, tutaj jest sposób.

UWAGA: musisz zadeklarować wszystkie zmienne.

Należy również zadeklarować listę nazw zmiennych.

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)])) 

I podzielić krok po kroku:

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}} 

chcę wspomnieć jeszcze raz, że to rozwiązanie, jeśli dobre, jeśli masz mnóstwo zmiennych i nie chcesz jawnie zadeklarować dict zrozumieniem . W innych przypadkach bardziej odpowiednie i czytelniejsze byłoby stosowanie innych rozwiązań, które są tutaj prezentowane.

0

Kolejna odmiana z użyciem podwójnie zip() i 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) 

wyjściowa:

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