2017-06-14 114 views
5

有這將是父字典的關鍵一個索引列表:如何使詞典的詞典與多個列表

index = [1,2,3] 

,然後多個列表,其中將孩子http://stardict.sourceforge.net/Dictionaries.php下載:

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

的時序元件是所述數據,導致:

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

怎麼可以做這個 ?

你覺得容易做的熊貓嗎?

+4

告訴我們您到目前爲止試過嗎? –

回答

0

實際上這是很容易的,並且可以用一個簡單的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) 

輸出:

{1:{ '三角形':4, '圓圈':7 ,'square':10},2:{'triangles':5,'circles':8,'squares':11},3:{'triangles':6,'circles':9,'squares':12 }}

1

快譯通comprehnesions來救援!
注意,順便說一句,存儲在index指數似乎是一個基礎,雖然Python列表是從零開始:

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

你可以做這樣的事情,

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

最簡單的方法是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

可以zip列表,創建subdicts,然後壓縮與subdicts指數。沒有限制上的指標;它們可以是非序貫/非數字:

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

在另一方面,如果你只需要連續數,索引列表,可以與enumerate取代:

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

這確實是一個開箱即用的解決方案:) +一位先生 –

+1

最酷的答案。 :) – Haranadh

0

如果你有很多變數,你不想硬編碼你的字典理解,這是一種方法。

注意:你需要有聲明的所有變量。

此外您還需要聲明變量名稱列表。

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

而且分分步:

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

我想提一個更多的時間,這個解決方案,如果好,如果你得到一噸的變量,你不想顯式聲明字典理解。在其他情況下,使用此處介紹的其他解決方案會更合適,更具可讀性。

0

使用其他多種雙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) 

輸出:

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