如何创建一个包含多个列表的字典字典?(关于)IT技术

6

有一个索引列表将成为父级字典的关键:

index = [1,2,3]

然后有多个列表,每个列表都是子字典:

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

我该怎么做?

你认为使用Pandas更容易吗?


4
请告诉我们你已经尝试过什么? - Shreyash S Sarnayak
7个回答

4
您可以将列表进行压缩,创建子字典,然后将子字典与索引一起压缩。 对索引没有任何限制;它们可以是非连续/非数字的:
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先生 - akash karothiya

1
字典解析来拯救!顺便提一下,index 中存储的索引似乎是基于一的,尽管 Python 列表是基于零的。
result =  {i : {'triangles' : triangles[i-1], 'circles' : circles[i-1], 'squares' : squares[i-1]} for i in index}

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

0

实际上这很容易,可以通过简单的for循环实现:

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,'正方形': 10},2:{'三角形': 5,'圆形': 8,'正方形': 11},3:{'三角形': 6,'圆形': 9,'正方形': 12}}


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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接