Python创建字典键路径类似于mkdir -p

2024-02-01

假设我们有一个从 json 解析出来的字典,并且我们以键路径的形式从键中读取值path-to.my.keys

my_dict['path-to']['my']['keys']

在文件系统中我们有mkdir -p如果不存在则创建这样的路径。

在Python中,我们是否有类似的语法/函数来创建key path对于 dict 又名缺少键的默认空字典? My 结果不是很有帮助。


TLDR

您可以使用dict.setdefault or collections.defaultdict.

def make_path(d: dict, *paths: str) -> None:
    for key in paths:
        d = d.setdefault(key, {})

make_path(my_dict, 'path-to', 'my', 'keys')
assert my_dict['path-to']['my']['keys'] is not None

详细信息

解决方案1。dict.setdefault:

my_dict.setdefault('path-to', {}).setdefault('my', {}).setdefault('keys', {})

Pros:

  • my_dict是正常的dict
  • 使 dict 仅显式发生
  • 无深度限制

Cons:

  • 你应该打电话setdefault方法每个用例。

解决方案2。collections.defaultdict:

from collections import defaultdict

my_dict = defaultdict(lambda: defaultdict(lambda: defaultdict(dict)))
my_dict['path-to']['my']['keys']

Pros:

  • 你不需要打电话检查存在性 at all.

Cons:

  • 字典的制作是隐式发生的。
  • my_dict不纯粹dict.
  • 根据定义,您有深度限制my_dict.

解决方案 3. 解决方案 1 的高级:创建自己的函数

def make_path(my_dict: dict, *paths: str) -> dict:
    while paths:
        key, *paths = paths
        my_dict = my_dict.setdefault(key, {})
    return my_dict


test = {'path-to': {'test': 1}}
print(test)

make_path(test, 'path-to', 'my', 'keys')['test2'] = 4
print(test)

print(make_path(test))  # It's okay even no paths passed

output:

{'path-to': {'test': 1}}
{'path-to': {'test': 1, 'my': {'keys': {'test2': 4}}}}
{'path-to': {'test': 1, 'my': {'keys': {'test2': 4}}}}

解决方案 4. 解决方案 2 的高级:创建您自己的类

class MyDefaultDict(dict):
    def __missing__(self, key):
        self[key] = MyDefaultDict()
        return self[key]


my_dict = MyDefaultDict()
print(my_dict)
my_dict['path-to']['my']['keys'] = 'hello'
print(my_dict)

output:

{}
{'path-to': {'my': {'keys': 'hello'}}}

结论

我觉得解决方案3与您的需求最相似,但如果适合您的情况,您可以使用任何其他选项。


Append

在解决方案 4 中,我们已经从 json 解析出了 dict :d 怎么样?您的解决方案从 MyDefaultDict() 类型开始,而不是从 jsons.loads() 返回的类型开始

如果你可以编辑json.loads部分,然后尝试:

import json


class MyDefaultDict(dict):
    def __missing__(self, key):
        self[key] = MyDefaultDict()
        return self[key]


data = '{"path-to": {"my": {"keys": "hello"}}}'
my_dict = json.loads(data, object_pairs_hook=MyDefaultDict)
print(type(my_dict))

output:

<class '__main__.MyDefaultDict'>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python创建字典键路径类似于mkdir -p 的相关文章

  • Flask 中“缺少 CSRF 令牌”,但它在模板中呈现

    问题 当我尝试登录 使用 Flask login 时 我得到Bad Request The CSRF session token is missing但令牌正在呈现 在模板中 secret key 已设置 并且我在本地运行localhost
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • 类型错误:“datetime.datetime”和“str”的实例之间不支持“>”

    我是 python 日期和时间类型的新手 我有一个日期值 date 2018 11 10 10 55 31 00 00 我需要检查该日期值是否超过 90 天 我试过 from datetime import datetime from da
  • 带有 mkdocs 的本地 mathjax

    我想在无法访问互联网的计算机上使用 MathJax 和 Mkdocs 因此我不能只调用 Mathjax CDN Config mkdocs yml site name My Docs extra javascript javascripts
  • 用 Python 绘制直方图

    我有两个列表 x 和 y x 包含字母表 A Z Y 包含它们在文件中的频率 我尝试研究如何在直方图中绘制这些值 但在理解如何绘制它方面没有成功 n bins patches plt hist x 26 normed 1 facecolor
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 设置高亮大括号的 vim 颜色主题

    如何更改突出显示大括号的 vim 配色方案 我希望实际编辑 vim 主题文件以使更改永久生效 问候 克雷格 匹配括号的自动高亮颜色称为MatchParen 您可以通过执行以下操作来更改 vimrc 中的颜色 highlight MatchP
  • 查找与另一列 Pandas 中的唯一值关联的列中的值的交集

    如果我有一个像这样的数据框 非常小的例子 col1 col2 0 a 1 1 a 2 2 b 1 3 b 2 4 b 4 5 c 1 6 c 2 7 c 3 我想要所有的交集col2当价值观与其独特性相关时col1值 因此在这种情况下 交集
  • 在请求中设置端口

    我正在尝试利用cgminer使用 Python 的 API 我对利用requests图书馆 我了解如何做基本的事情requests but cgminer想要更具体一点 我想缩小 import socket import json sock
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • 无法使用 python rasterio、gdal 打开 jp2 (来自哨兵)

    我试图在 python 中将 jp2 栅格产品作为栅格打开 但当我们使用 raterio 和 gdal 包时没有成功 我收到此错误 RasterioIOError b4 jp2 not recognized as a supported f
  • 从 wxPython 事件处理程序中调用函数

    我正在努力寻找一种在 wxPython 事件处理函数中使用函数的方法 假设我有一个按钮 单击该按钮时 它会使用事件处理程序运行一个名为 OnRun 的函数 但是 用户忘记单击 OnRun 按钮之前的 RadionButton 我想弹出一个
  • 如何展平解析树并存储在字符串中以进行进一步的字符串操作 python nltk

    我正在尝试从树结构中获取扁平树 如下所示 我想将整个树放在一个字符串中 就像没有检测到坏树错误一样 S NP SBJ NP DT The JJ high JJ seven day PP IN of NP DT the CD 400 NNS
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org
  • pandas.read_fwf 忽略提供的数据类型

    我正在从文本文件导入数据框 我想指定列的数据类型 但 pandas 似乎忽略了dtype input 一个工作示例 from io import StringIO import pandas as pd string USAF WBAN S
  • 使用 pandas 单元格中列表的长度选择行[重复]

    这个问题在这里已经有答案了 我有一张表 df a b c 1 x y x 2 x z c d 3 x t e f g 只是想知道如何使用 c 列的长度选择行 such as df loc len df c gt 1 我知道这是不对的 正确的
  • 基于值的 matplotlib 条形图颜色

    有没有一种方法可以根据条形图的值对条形图的条形进行着色 例如 values below 0 5 red values between 0 5 to 0 green values between 0 to 08 blue etc 我找到了一些
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • 在 Angular js 中使用 ng-class 中的函数

    我在用ng class用于添加 CSS 类 尽管有很多关于此的文章 但我无法添加函数调用ng class 我有以下表达 ng class highlighter row Class file id 1 file processed bold
  • 如何在 Visual Studio Code 中为我的 Electron 应用程序使用 ${workspaceRoot}?

    我有一个 Electron 应用程序 我可以在 Visual Studio Code 中调试它 我升级到版本 0 10 8 后 它将不再运行 我在 launch json 文件中收到以下错误消息 相对路径将不再自动转换为绝对路径 考虑使用
  • 通过 XSD 限制基于另一个元素的 XML 元素

    我相信这与keyref但我不确定 我真的不确定它是否可以做到 例如 假设我有 myElement1 和 myElement2 如果 XML 文件中没有 myElement2 则 myElement1 必须存在 否则是可选的 有没有办法在我的
  • 使所选项目适合一行,而不是两行

    我有一个非常简单的选择 当我单击菜单时 它会显示 3 个选项 每个选项都在一行上 但是 当我选择一个项目时 它会显示为 2 行 第一行用于文本 另一行用于图标 我该如何使它成为一根线 import styles css import Edi
  • 使用 SqlCommand.Parameters.AddWithValue 时是否应该包含 @?

    在使用 AddWithValue 时 我总是在参数名称中包含 at 符号 但我只是注意到其他人编写的一些代码没有使用它 一种方法比另一种方法更正确吗 cmd Parameters AddWithValue ixCustomer ixCust
  • 在 Snow Leopard 上运行 iPhone 5 模拟器

    我正在我的 mac 上运行 iOS6 SDK 在 Snow Leopard 上运行 Xcode 4 2 使用以下步骤堆栈溢出帖子 https stackoverflow com questions 9613565 is it possibl
  • LINQ 到 XYZ 多态性?

    我遇到过这样的情况 客户要求我们实现数据访问代码 以根据运行时配置设置使用 Oracle 或 SQL Server 数据库 生产环境使用 Oracle 但开发和 QA 都针对 SQL Server 实例运行 我对此没有任何控制权 也没有任何
  • 如何使用Java 8流遍历多个列表?

    我有三份清单 List
  • 如何开始学习android框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 QtCreator 中分​​析 PySide2 + QML?

    我有一个 PySide2 应用程序 它使用 QML 来显示用户界面 该应用程序通过命令行运行 我还可以启动它并在 QtCreator 中调试它 但是 当我尝试运行 QmlProfiler 时 我看到以下错误 1 error home use
  • 从使用中的相机拍照

    如何从正在使用的前置摄像头拍照而不在屏幕上显示摄像头 我有服务舱 public class PhotoTakingService extends Service Camera variables a surface holder priva
  • 如何修改 TDataSetProvider.OnUpdateData 中的字段值

    阅读有关 TDataSetProvider OnUpdateData 的 Delphi 帮助文件后 事件说明 检查数据 例如 不允许的值或数据更改 并引发异常 在更新发生之前取消应用 在将数据发送到源数据集或数据库服务器之前更改数据 例如加
  • 更改 Material UI 中的 TextField 字体颜色?

    我目前正在使用材质用户界面 https mui com 我在尝试更改多行的字体颜色时遇到问题TextField
  • 如何在 iOS 设备上运行 .app [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有应用程序的 app 文件 我有 mac 和 iPhone 但没有安装 Xcode 如何在没有 Xcode 的情况下在 iPhone 上
  • 无法安装 SQL Server (setup.exe)

    我在笔记本电脑上使用了 SQL Server 2019 Express 版本 但我卸载了 现在我尝试安装 SQL Server 2019 Developer Edition 但出现错误 退出代码 十进制 2068119551 退出消息 找不
  • 使用 PostGIS 围绕线串创建多边形

    我是 PostGIS 新手 需要在这里寻求一些帮助 我有一条来自谷歌地图的折线 代表行程 需要在其周围构建一个具有特定距离 以米或公里为单位 的多边形 缓冲区 对于输入 我有纬度 经度点列表和所需的缓冲距离 任何人都可以帮助我构建查询 以便
  • 在我的网站中使用 PHPBB2 登录凭据

    我目前正在使用 PHPBB2 论坛作为我网站之一的一部分 并且我想扩展该网站 添加新页面 脚本等 我想将对这些页面的访问限制为已登录 PHPBB2 论坛的用户 事实上 如果只有某个 MemberGroup 的成员可以访问这些页面 那就太好了
  • 是否可以检测弹窗中的用户点击事件?

    如果当前 url 和弹出 url 位于同一域中 我可以使用以下代码检测弹出窗口中的用户单击事件 var myWindow window open abc html MsgWindow width 500 height 600 myWindo
  • 在 BST 中寻找 k 个后继者的时间复杂度

    给定高度的二叉搜索树 BST h 需要O k h 时间来应用BST InOrder Successor 算法 https stackoverflow com a 5471990 5459839 k连续多次 从任何节点开始 将每个下一个调用应
  • Python创建字典键路径类似于mkdir -p

    假设我们有一个从 json 解析出来的字典 并且我们以键路径的形式从键中读取值path to my keys my dict path to my keys 在文件系统中我们有mkdir p如果不存在则创建这样的路径 在Python中 我们