多级字典创建

时间:2018-10-23 11:17:11

标签: python json python-2.7 dictionary defaultdict

样本输入代替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首先分配,则可以执行附加操作,但是,我正在寻找更好的干净解决方案。请提出建议。谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用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']}}

答案 1 :(得分:0)

这是使用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']})}