【问题标题】:Merging dictionaries in specific order按特定顺序合并字典
【发布时间】:2017-08-22 14:46:53
【问题描述】:

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

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

例如:

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

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

【问题讨论】:

  • 您的问题是什么?没有人愿意为您调试代码。
  • 我的问题是如何正确地做到这一点,我的代码不需要调试,因为它只是一个开始,加载我的泡菜文件并创建字典列表。
  • 您提供的代码并不真正相关。您尝试过什么来实际解决根据您的要求合并字典的问题?可能有成千上万个类似的问题。您在研究中发现了什么?请参阅How to Ask
  • 不要在 cmets 中发布代码,它完全不可读。编辑您的问题并将其添加到那里。

标签: python dictionary merge pickle


【解决方案1】:

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

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)

【讨论】:

  • 谢谢!正是我要求的。
猜你喜欢
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 2023-02-13
  • 2021-02-27
相关资源
最近更新 更多