按特定顺序合并字典

时间:2017-08-22 14:46:54

标签: python dictionary merge pickle

我在这里发帖是因为我无法找到问题的答案。

让我解释一下:我正在尝试进行多处理任务。 我有10个工人,每个人都返回一个字典,值是3个元素的列表,2个整数和1个列表:

例如:

worker 0返回{0 : [3,15, [[0,1,1], [1,1,0]] , 2 : [11,14, [[3,0,1], [1,4,2]]}

工人1返回{0 : [6,8, [[4,1,7], [5,8,8]] , 2 : [19,27, [[6,1,11], [4,4,2]]}

worker 2返回{0 : [13, 7, [[0,1,1], [1,1,0]], 2 : [7, 3, [[3,0,1], [5,3,1]]}

这些词典存储在不同的pickle文件中。

在这种情况下,我有2个不同的键,所以我想要2个词典(但数字是变量)。

他们看起来应该是这样的:

d1 = {0 : [X ,Y, [[0,1,1], [4,1,7],[0,1,1],[1,1,0],[5,8,8],[1,1,0] }

d1 = {2 : [X ,Y, [[0,1,1], [4,1,7],[0,1,1],[1,1,0],[5,8,8],[1,1,0] }

X是第一个元素的总和= 3 + 6 + 13 = 22

Y是第二个元素的总和= 15 + 8 + 7 = 30

请注意列表的列表元素是隔行扫描的,而不是连接的,我必须循环工作者并且每次都要占用一个元素。

我的代码就是这样开始的:

def mergeAnalysis(outPath, nbWorkers):
        for i in range(nbWorkers):
            with open(os.path.join(outPath, "ERROR_TEMP{}.p".format(i)), 'rb') as fichier:
                dictlist.append(pickle.load(fichier))

dictlist是词典列表。

如果有人有这个想法吗? 非常感谢你的帮助

编辑:我试图提取字典的值:

for j in range(0,len(dictlist)):
    for k1 in dictlist[j].keys():
        a = dictlist[j].get(k1)

1 个答案:

答案 0 :(得分:0)

假设您有一个工人返回的输出列表。假设订单可能很重要,因此此列表具有特定订单。基本上,假设你有这个:

worker_outputs = [
    {0: [3, 15, [[0, 1, 1], [1, 1, 0]]], 2: [11, 14, [[3, 0, 1],  [1, 4, 2]]]},
    {0: [6, 8,  [[4, 1, 7], [5, 8, 8]]], 2: [19, 27, [[6, 1, 11], [4, 4, 2]]]},
    {0: [13, 7, [[0, 1, 1], [1, 1, 0]]], 2: [7,  3,  [[3, 0, 1],  [5, 3, 1]]]},
]

迭代工作输出的键将使解决这个问题变得容易得多。

import pprint
keys = set(k for output in worker_outputs for k in output)

results = {}
for key in keys:
    outputs_with_key = [output[key] for output in worker_outputs if key in output]

    results[key] = [
        sum(l[0] for l in outputs_with_key),
        sum(l[1] for l in outputs_with_key),
        zip(*(l[2] for l in outputs_with_key)),
    ]

pprint.pprint(results)