2017-06-14 36 views
5

Có một danh sách chỉ số đó sẽ là chìa khóa của từ điển cha mẹ:Làm thế nào để tạo ra một từ điển của từ điển với nhiều danh sách

index = [1,2,3] 

và sau đó nhiều danh sách trong số đó sẽ là dicts con:

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

các yếu tố liên tục là dữ liệu, kết quả là:

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

thế nào tôi có thể làm cái này ?

Bạn có nghĩ dễ dàng hơn khi làm trong gấu trúc không?

+4

Hãy cho chúng tôi những gì bạn đã cố gắng cho đến nay? –

Trả lời

0

Trên thực tế điều này rất dễ dàng và có thể đạt được với một đơn giản 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: { 'tam giác': 4, 'Vòng kết nối': 7 , 'hình vuông': 10}, 2: {'tam giác': 5, 'vòng tròn': 8, 'hình vuông': 11}, 3: {'tam giác': 6, 'vòng tròn': 9, 'hình vuông': 12 }}

1

Dict hiểu để giải cứu!
Note, BTW, mà các chỉ số được lưu trữ trong index dường như là một căn cứ mặc dù danh sách python là zero-based:

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

Bạn có thể làm một cái gì đó như thế này,

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

Phương pháp đơn giản nhất là với 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

Bạn có thể zip danh sách, tạo subdicts và sau đó zip subdicts với các chỉ số. Không có các hạn chế trên các chỉ số; họ có thể không sequencial/không số:

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

Ngày lưu ý khác, nếu bạn chỉ cần đếm tuần tự, danh sách chỉ số có thể được thay thế bằng enumerate:

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

thực sự là một giải pháp trong hộp :) + một câu trả lời hay nhất của Sir –

+1

. :) – Haranadh

0

Nếu bạn có nhiều biến và bạn không muốn mã hóa từ điển của bạn, đây là một cách.

LƯU Ý: bạn cần phải có tất cả các biến được khai báo.

Ngoài ra, bạn cần khai báo danh sách tên biến.

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

Và để chia từng bước:

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

tôi muốn đề cập đến thời gian thêm một rằng giải pháp này nếu tốt nếu bạn nhận được một tấn của các biến và bạn không muốn dứt khoát tuyên bố dict hiểu . Trong các trường hợp khác, nó sẽ phù hợp hơn và dễ đọc hơn khi sử dụng các giải pháp khác được trình bày ở đây.

0

Một loạt sử dụng đôi zip()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}} 
Các vấn đề liên quan