多级字典创建

Multi-level dictionary creation

代替 separate_function 的示例输入:

separate_function = [('primary_1', 'val_1'), ('primary_1', 'val_2'), ('primary_3', 'val_2')] 

预期输出即my_dictionary

{
    "main": {
        "primary_1": [
            "val_1",
            "val_2"
        ],
        "primary_3": [
            "val_2"
        ]
    }
}

我想创建一个字典,my_dictionary如上。

预期输出中有多个键,如 "main"。为了降低问题的复杂性,我对其进行了硬编码。 有一个生成器函数,我需要对其进行迭代以创建此格式。同样为了简单起见,我将其显示为元组列表。到目前为止我已经尝试过:

from collections import defaultdict
my_dictionary = defaultdict(dict)
for primary_var, value in separate_function:
    my_dictionary['main'][primary_var].append(value)
    # This would have worked if I have expected values as string 
    # rather than a list in that case I can write the above line like this:
    my_dictionary['main'][primary_var] = value

tryexcept 可以使用,如果 KeyError 则先分配,否则可以完成追加,但是,我正在寻找一个更好的干净解决方案。请建议。谢谢。

这是一种使用 collections.defaultdict 的方法。

演示:

from collections import defaultdict
separate_function = [('primary_1', 'val_1'), ('primary_1', 'val_2'), ('primary_3', 'val_2')] 
result = defaultdict(list)
for k, v in separate_function:
    result[k].append(v)


my_dictionary = {"main": result}
print(my_dictionary)

输出:

{'main': defaultdict(<type 'list'>, {'primary_3': ['val_2'], 'primary_1': ['val_1', 'val_2']})}

您可以使用 dict.setdefault 用新列表初始化新的字典键:

my_dictionary = {'main': {}}
for k, v in separate_function:
    my_dictionary['main'].setdefault(k, []).append(v)

my_dictionary 会变成:

{'main': {'primary_1': ['val_1', 'val_2'], 'primary_3': ['val_2']}}