作为一个简化的例子,假设我有以下字典,它告诉我一家公司不同地点的员工人数:

start_dict = {
    "/BUILDING_A/FLOOR_3/ROOM_12": 3, 
    "/BUILDING_A/FLOOR_3/ROOM_15": 4,
    "/BUILDING_A/FLOOR_4/ROOM_3": 2,
    "/BUILDING_B/FLOOR_1": 5,
    "/BUILDING_B/FLOOR_2": 3,
    "/BUILDING_C": 25,
    "/BUILDING_D": 32,
}

每个字典键都是具有一个或多个以斜杠分隔的元素的字符串.在我的真实数据中,每个键可以包含任意数量的元素.

我希望将这个入门词典转换为嵌套词典.所需结果如下所示:

{
    "BUILDING_A": {
        "FLOOR_3": {
            "ROOM_12": 3,
            "ROOM_15": 4,
        },
        "FLOOR_4": {
            "ROOM_3": 2
        },
    },
    "BUILDING_B": {
        "FLOOR_1": 5,
        "FLOOR_2": 3,
    },
    "BUILDING_C": 25,
    "BUIDLING_D": 32,
}

到目前为止已try 过

我试着改编这个answer,但不能很好地使它工作.这是我想出的代码:

result_dict = {}
for key, value in start_dict.items():
    new_keys = key.lstrip("/").split("/")
    current_dict = result_dict
    for new_key in new_keys[:-1]:
        current_dict = current_dict.get(new_key, {})
    current_dict[new_keys[-1]] = value

这给出了以下result_dict分:

{'BUILDING_C': 25, 'BUILDING_D': 32}

推荐答案

您想在这里插入new_key,如果它还没有包含在词典中:

current_dict = current_dict.get(new_key, {})

为此,请将该行更改为

current_dict = current_dict.setdefault(new_key, {})

结果:

{
    "BUILDING_A": {
        "FLOOR_3": {
            "ROOM_12": 3,
            "ROOM_15": 4
        },
        "FLOOR_4": {
            "ROOM_3": 2
        }
    },
    "BUILDING_B": {
        "FLOOR_1": 5,
        "FLOOR_2": 3
    },
    "BUILDING_C": 25,
    "BUILDING_D": 32
}

Python相关问答推荐

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

如何使用使用来自其他列的值的公式更新一个rabrame列?

找到相对于列表索引的当前最大值列表""

Cython无法识别Numpy类型

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

如何从一个维基页面中抓取和存储多个表格?

合并Pandas中的数据帧,但处理不存在的列

Pip:卸载`-e`安装过程中安装的所有pkgs

使用BeautifulSoap库从Web获取表格时没有响应

有没有更快的方法来快速修改、更新和排序列表或词典?

如何在python中为列表中的每个项目分配来自另一个列表的相等数量的项目

使用GEKKO将两个总体拟合到测量值如何优化第一个数据点

在Numpy数组中的列子集上聚合

在连接redis到django和docker之后,数据不会保存在redis-tags中

ImportError:在安装过程中找不到InstructorEmbedding的配置文件

没有目标的验证数据

如何将SELECT语句中的项逐个追加到列表中?

使用boto3检索AWS机密

如何从标准输入中读取超过4096个字节,并将其复制粘贴到Linux上的终端?

压平JSON后的Pandas 保留柱