添加字典而不是覆盖 - defaultdict

时间:2016-02-24 04:24:44

标签: python dictionary defaultdict

我有一个名为" n"它将具有键值关系(Dict in dict)。

此处的密钥为tenant_id (b77865b66fd544e0841aa7dbca8bdc97, 7b73b9644e8242b3a740afc4659d9829)

因此Dict将拥有一个键值对关系,其中包含tenant_id及其相关的实例名称。

示例代码:

    n = defaultdict(dict)

    r = q.all()

    # For getting the values of sql obj
    for m in r:

            g = m.__dict__

            g.pop('_sa_instance_state', None)

            tenant_id = g['tenant_id']

            n[tenant_id] = g

    n = json.dumps(n, default=json_util.default)

所以现在一个租户将拥有更多的那个实例。

在这里,我面临覆盖与密钥相关的值的问题。

我需要在这里添加dict而不是覆盖它。

在这里,我提供了相同的结果。

预期结果:

{u'b77865b66fd544e0841aa7dbca8bdc97': {u'instance_name': u'instance_for_test'},{u'instance_name': u'new_instance'}, u'7b73b9644e8242b3a740afc4659d9829': {u'instance_name': u'demo'}}

实际结果:

{u'b77865b66fd544e0841aa7dbca8bdc97': {u'instance_name': u'new_instance'}, u'7b73b9644e8242b3a740afc4659d9829': {u'instance_name': u'demo'}}

有人让我知道这个问题的解决方案。

注意:

我试过追加和扩展等等,但因为它是Dict似乎没有工作。

1 个答案:

答案 0 :(得分:1)

n = defaultdict(dict)
# ...
n[tenant_id] = g

确实会使用tenant_id的值覆盖密钥。不要使用=设置值,而是在结果上调用方法,如下所示:

n = defaultdict(dict)
n[tenant_id].update(g)

看到您的预期结果不是有效的Python,您可能希望拥有列表值而不是dicts。易:

n = defaultdict(list)
# ...
n[tenant_id].append(g)