如何在Python中拆分字典数组?

如何在Python中拆分字典数组?,python,dictionary,Python,Dictionary,下面是Python中的字典数组。我想在Python中将数组转换为以下三个数组: [{50: 2, 75: 3, 99: 4}, {50: 5, 75: 6, 99: 7}, {50: 8, 75: 9, 99:10}] 一种方法是使用defaultdict,使其成为对应于键的list值的字典: [2, 5, 8] # corresponding to 50. [3, 6, 9] # corresponding to 75. [4, 7, 9] # corresponding to 99.

下面是Python中的字典数组。我想在Python中将数组转换为以下三个数组:

[{50: 2, 75: 3, 99: 4}, {50: 5, 75: 6, 99: 7}, {50: 8, 75: 9, 99:10}] 

一种方法是使用
defaultdict
,使其成为对应于键的
list
值的字典:

[2, 5, 8] # corresponding to 50.
[3, 6, 9] # corresponding to 75.
[4, 7, 9] # corresponding to 99. 
每个值的列表可通过以下键访问:

from collections import defaultdict

my_list = [{50: 2, 75: 3, 99: 4}, {50: 5, 75: 6, 99: 7}, {50: 8, 75: 9, 99:10}] 
my_dict_list = defaultdict(list)

for value in my_list:
    for k,v in value.items():
        my_dict_list[k].append(v)

假设您的列表存储为
l
,您可以使用
zip
在以下范围内转换dict值:

print(my_dict_list[50])
这将返回:

list(zip(*(d.values() for d in l)))

鉴于列表中的所有词典都具有相同的键,您可以使用词典和列表理解:

[(2, 5, 8), (3, 6, 9), (4, 7, 10)]

Python dict是一个未排序的集合,至少在Python 3.6之前是这样,所以不能保证键保留插入顺序。既然你想让键按数字顺序排列,我们就需要对它们进行排序

然后,我们可以使用列表理解从列表中的每个dict中提取相应的值,并使用元组分配将列表中的每个dict分配给一个单独的名称

>>> {k: [d.get(k) for d in my_list_of_dicts] for k in my_list_of_dicts[0]}
{50: [2, 5, 8], 75: [3, 6, 9], 99: [4, 7, 10]}

FWIW,将输出保存为单个列表可能更方便,而不是保存为3个单独的列表。

如果您的目标是3个单独的列表,则可以创建每个列表,并进行列表理解

或者,您可以构造一个字典并按
键查找每个列表

l = [{50: 2, 75: 3, 99: 4}, {50: 5, 75: 6, 99: 7}, {50: 8, 75: 9, 99:10}]

l_50 = [v for i in l for k, v in i.items() if k == 50] # => [2, 5, 8]
l_75 = [v for i in l for k, v in i.items() if k == 75] # => [3, 6, 9]
l_99 = [v for i in l for k, v in i.items() if k == 99] # => [4, 7, 10]

你能保证列表中的所有dict都有相同的键吗?键的数量总是3吗?是的,所有dict都有相同的键fyi,Python调用这些列表,它们的行为更像ArrayList而不是数组。注释是
#
,没有分号。您可能希望相应地澄清您的问题和标签。如果您更改任何一本词典中键的顺序,这将不会产生正确的答案。正如@PM2Ring所指出的,在3.6版本之前,订单是不受保证的。我想类似于
list(zip(*(OrderedDict(sorted(x.items()))).values()(for x in d))
的东西可以在这里做吗?
l = [{50: 2, 75: 3, 99: 4}, {50: 5, 75: 6, 99: 7}, {50: 8, 75: 9, 99:10}]

l_50 = [v for i in l for k, v in i.items() if k == 50] # => [2, 5, 8]
l_75 = [v for i in l for k, v in i.items() if k == 75] # => [3, 6, 9]
l_99 = [v for i in l for k, v in i.items() if k == 99] # => [4, 7, 10]
d = {k: [j[x] for j in l for x in j if x == k] for i in l for k in i}
{50: [2, 5, 8], 75: [3, 6, 9], 99: [4, 7, 10]}