仅更新值n嵌套的字典

时间:2019-06-12 15:41:49

标签: python python-3.x

我正在尝试update在for循环中更新嵌套字典的值,因此它不会每次都生成新的字典,我对遍历嵌套结构非常陌生,所以请耐心等待。每个值都位于一个列表中:

我的列表:

id_list = ['asf245', 'kjb456', '235sdg']

我的字典:

temp = {"ent": {"type": "IDN", "attributes": [{"ent": {"id": "abc123"}}], "limit": 20}}

理想情况下,我会将每个更新字典附加到一个数据框,然后使用新值对其进行更新:

理想的输出:

    temp = {"ent": {"type": "IDN", "attributes": [{"ent": {"id": "asf245"}}], "limit": 20}}

    temp = {"ent": {"type": "IDN", "attributes": [{"ent": {"id": "kjb456"}}], "limit": 20}} 

    temp = {"ent": {"type": "IDN", "attributes": [{"ent": {"id": "235sdg"}}], "limit": 20}}

temp在每次迭代后附加到数据帧的位置,然后被新值覆盖:

我尝试过:

import collections

def update(d, u):

    for k, v in u.items():
        if isinstance(v, collections.Mapping):
            d[k] = update(d.get(k, {}), v)
        else:
            d[k] = v
    return d

print(update(temp, 'Apples')) <- "run this through a loop"

但是通过可视化工具运行它,我可以看到它还不够深入,如果有人能解释它的话,我对此并没有真正的了解。

2 个答案:

答案 0 :(得分:1)

这里。函数的结果是字典列表(具有修改的ID)

import copy


def clone_dict(d, ids):
    result = []
    for id in ids:
        clone = copy.deepcopy(d)
        clone['ent']['attributes'][0]['ent']['id'] = id
        result.append(clone)
    return result


temp = {"ent": {"type": "IDN", "attributes": [{"ent": {"id": "abc123"}}], "limit": 20}}
ids = ['x', 'y', 'z']

print(clone_dict(temp, ids))

输出

[{'ent': {'attributes': [{'ent': {'id': 'x'}}], 'type': 'IDN', 'limit': 20}}, {'ent': {'attributes': [{'ent': {'id': 'y'}}], 'type': 'IDN', 'limit': 20}}, {'ent': {'attributes': [{'ent': {'id': 'z'}}], 'type': 'IDN', 'limit': 20}}]

下面的通用方法

import copy


def clone_dict(src_dict, values_to_inject, path_elements):
    """ Clone a dict N times and replace a nested field

    :param src_dict: Used as 'template'
    :param values_to_inject: List of values to inject
    :param path_elements: List of path elements. Used in dict navigation
    :return: A list of cloned modified dicts
    """
    result = []
    for value in values_to_inject:
        clone = copy.deepcopy(src_dict)
        temp = clone[path_elements[0]]
        for path_element in path_elements[1:-1]:
            temp = temp[path_element]
        temp[path_elements[-1]] = value
        result.append(clone)
    return result


src_dict = {"ent": {"type": "IDN", "attributes": [{"ent": {"id": "abc123"}}], "limit": 20}}
values_to_inject = ['x', 'y', 'z']
path_elements = ['ent', 'attributes', 0, 'ent', 'id']

print(clone_dict(src_dict, values_to_inject, path_elements))

答案 1 :(得分:1)

这是涉及递归的更通用的解决方案。它需要一个字典来更新,要更新的密钥以及要更新的值。

subject