如何通过使用内部键值对,将字典列表转换为字典套字典

3

所以,我不打算先解释事情的内容,而是直接展示我拥有的和我想要的(这样更容易):

我拥有的内容:

dict_list = [
    {'some': 1.2, 'key': 1.3, 'words': 3.9, 'label': 0},
    {'other': 1.2, 'wordly': 1.3, 'words': 3.9, 'label': 1},
    {'other': 10, 'work': 1.3, 'like': 3.9, 'label': 1},
]

我想从我所拥有的获取什么:

dict_dict = { "0":{'some': 1.2, 'key': 1.3, 'words': 3.9},
              "1":{'other': 10, 'wordly': 1.3, 'work': 1.3, 'like': 3.9, 'words': 3.9},
}

解释:

因此,我想通过使用“label”键作为新字典的主键来创建一个字典。我还需要合并具有相同标签的字典。在合并时,如果存在重复的键(例如示例中的“other”键),则需要保留最高值。

为什么我不在创建原始字典列表之前完成所有这些操作呢?

因为dict_list是joblib(多进程)过程的结果。在进程之间共享某些对象会减慢多进程处理速度。因此,我决定在多个核心上运行繁重的工作,然后再进行整理。我不确定这种方法是否有帮助,但我没有测试就无法知道。

2个回答

1
计数器模块具有很好的合并功能a|b,它可以将字典合并在一起,并保留较高的值。
from collections import Counter
dict_dict = {}
for dictionary in dict_list:
    label = str(dictionary.pop('label'))
    dict_dict[label] = dict_dict.get(label,Counter())|Counter(dictionary)

###If you don't need Counters, just convert back to dictionaries
dict_dict = {i:dict(v) for i,v in dict_dict.items()}

这似乎返回了我想要的结果。我对它的内存使用有一些担忧。我需要进行一些测试。谢谢! - MehmedB
有没有一种简单的方法可以在不生成新字典的情况下完成这个任务? - MehmedB
1
a|b,即在相同的键中保留更高的值,在Python中尚不可用(它将在Python3.9中发布,因此您将不需要Counter)。否则,您需要生成至少一个新字典,并通过迭代键来更新它的最大值。我写这个只是为了方便编程。 - Himanshu Sheoran

0

易如反掌:

dict_of_dicts = {i:item for  i,item in enumerate(list_of_dicts)}

如果你坚持在键中使用字符串:

dict_of_dicts = {str(i):item for  i,item in enumerate(list_of_dicts)}

这不是使用 "label" 关键字作为键。 - MehmedB

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