python中有序字典的有序字典

2023-12-29

我需要一个存储字典的字典数据结构,如下所示:

custom = {1: {'a': np.zeros(10), 'b': np.zeros(100)}, 
          2: {'c': np.zeros(20), 'd': np.zeros(200)}}

但问题是我在代码中多次迭代这个数据结构。每次迭代它时,我都需要遵守迭代的顺序,因为这个复杂数据结构中的所有元素都映射到一个一维数组(如果愿意,可以序列化),因此顺序很重要。我想过写一个有序的dict订购的dict就此而言,但我不确定这是正确的解决方案,因为我似乎可能选择了错误的数据结构。对于我的情况来说,最合适的解决方案是什么?

UPDATE

这就是我到目前为止想到的:

class Test(list):

    def __init__(self, *args, **kwargs):

        super(Test, self).__init__(*args, **kwargs)

        for k,v in args[0].items():
            self[k] = OrderedDict(v)

        self.d = -1
        self.iterator = iter(self[-1].keys())
        self.etype = next(self.iterator)
        self.idx = 0


    def __iter__(self):
        return self

    def __next__(self):

        try:
            self.idx += 1
            return self[self.d][self.etype][self.idx-1]

        except IndexError:

            self.etype = next(self.iterator)
            self.idx = 0
            return self[self.d][self.etype][self.idx-1]

    def __call__(self, d):

        self.d = -1 - d
        self.iterator = iter(self[self.d].keys())
        self.etype = next(self.iterator)
        self.idx = 0
        return self


def main(argv=()):

    tst = Test(elements)
    for el in tst:
        print(el)
    # loop over a lower dimension
    for el in tst(-2):
        print(el)

    print(tst)


    return 0

if __name__ == "__main__":
    sys.exit(main())

我可以在这个有序结构中迭代任意多次,并且我实现了__call__所以我可以迭代较低的维度。我不喜欢这样一个事实:如果列表中没有较低的维度,它不会给我任何错误。我也有这样的感觉,每次打电话return self[self.d][self.etype][self.idx-1]比字典上的原始迭代效率低。这是真的?我该如何改进这个?


这是另一种使用OrderedDefaultdict定义您想要的树状数据结构。我正在重用另一个人的定义answer https://stackoverflow.com/questions/4126348/how-do-i-rewrite-this-function-to-implement-ordereddict/4127426#4127426我的。

要使用它,您必须确保条目是按照您稍后要访问它们的顺序定义的。

class OrderedDefaultdict(OrderedDict):
    def __init__(self, *args, **kwargs):
        if not args:
            self.default_factory = None
        else:
            if not (args[0] is None or callable(args[0])):
                raise TypeError('first argument must be callable or None')
            self.default_factory = args[0]
            args = args[1:]
        super(OrderedDefaultdict, self).__init__(*args, **kwargs)

    def __missing__ (self, key):
        if self.default_factory is None:
            raise KeyError(key)
        self[key] = default = self.default_factory()
        return default

    def __reduce__(self):  # optional, for pickle support
        args = (self.default_factory,) if self.default_factory else ()
        return self.__class__, args, None, None, self.iteritems()

Tree = lambda: OrderedDefaultdict(Tree)

custom = Tree()
custom[1]['a'] = np.zeros(10)
custom[1]['b'] = np.zeros(100)
custom[2]['c'] = np.zeros(20)
custom[2]['d'] = np.zeros(200)

我不确定我是否理解你的后续问题。如果数据结构仅限于两层,则可以使用嵌套for循环以按照定义的顺序迭代其元素。例如:

for key1, subtree in custom.items():
    for key2, elem in subtree.items():
        print('custom[{!r}][{!r}]: {}'.format(key1, key2, elem))

(在 Python 2 中你会想使用iteritems()代替items().)

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

python中有序字典的有序字典 的相关文章

  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • IRichBolt 在storm-1.0.0 和 pyleus-0.3.0 上运行拓扑时出错

    我正在运行风暴拓扑 pyleus verbose local xyz topology jar using storm 1 0 0 pyleus 0 3 0 centos 6 6并得到错误 线程 main java lang NoClass
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像

随机推荐

  • 无法配置 Firebase InstanceID

    您好 我正在尝试在我的应用程序中包含 firebase 并遵循文档 当我尝试进行 google 登录时 出现无法配置 Firebase InstanceID 错误 请建议如何克服此错误 有两件事需要检查 希望其中一项能为您解决 确保您的捆绑
  • 无法从 Xcode 运行 Instruments

    我最近升级到 Snow Leopard 从那以后我很难运行 Instrument 来从 Xcode 检测我的应用程序 录制 按钮将变灰 并且什么也不会发生 Xcode 的控制台中也没有消息告诉我出了什么问题 我曾经能够将其附加到进程或从仪器
  • 如何使用 jQuery 在 IE 中附加样式表?

    大家好 我只是想创建一个插件 我需要它对用户友好 所以我想append the 标签上的head加载我的插件时用户页面的一部分 它适用于所有其他浏览器 不确定 IE9 IE7 和 IE6 但不适用于 IE8 我不知道我的插件出了什么问题 所
  • 在 CakePHP 中重写 php 应用程序

    因此 我很想使用 php 框架重写我的应用程序 因为我认为这会让人们更容易参与 并改进应用程序的设计 CakePHP 看起来是最好的 PHP Web 框架 有人有这方面的经验吗 从手动编写 PHP 到使用框架 我应该考虑哪些注意事项 不取决
  • 写入 Mac OS X 10.7 中的“~/Library/Application Support”文件夹

    我可以使用 NSFileManager 在 Mac OS X 10 5 和 10 6 中的 Library Application Support 中创建 XYZ 文件夹 然而 在 10 7 中 它显示 您无权将 XYZ 保存在文件夹 应用
  • Enterprise Library 5.0 - 将自定义标记添加到 TextFormatter

    我创建了一个自定义异常 其中包含与我们的应用程序相关的数据 我想确保在引发异常时记录这些数据并将其记录到事件日志中 我尝试创建一个正在调用的自定义 TextFormatter 但不确定如何访问当前异常 以便我可以将自定义信息添加到日志条目中
  • Google Vision ocr:垂直和水平线文本识别

    我们正在使用 google Vision ocr 来收集收据中的文本 在某些情况下 收据上有一些垂直书写的文本 例如增值税信息等 问题是 谷歌视觉仅有效地读取主方向 例如水平方向 的文本 并丢弃在同一收据中以垂直方向而不是水平方向写入的所有
  • 向下滚动并双击最后一个展开/折叠箭头时,TreeTableView 项目消失

    在与一个TreeTableView我意识到 当您向下滚动表格并双击最后一个展开 折叠箭头时 所有项目都会消失 但是 当您再次滚动时 所有项目都会重新出现 当然 当你有足够的物品时就会发生这种情况 因此垂直ScrollBar活跃 以前有人遇到
  • 为什么结构类型的编译时生成技术会阻止单独编译?

    我正在读 好吧 略读 杜博切特和奥德斯基的在 JVM 上编译结构类型 http infoscience epfl ch record 138931 files 2009 structural pdf并对以下说法感到困惑 Generative
  • Scala 隐式转换陷阱

    EDIT好的 Drexin 提出了一个很好的观点 使用隐式转换器时类型安全性的损失 令人惊讶的结果 一个不太常见的转换怎么样 不会与 PreDef 隐式发生冲突 例如 我正在 Scala 中使用 JodaTime 很棒的项目 在定义隐式的同
  • 如果某些数据包含空格,如何读取逗号分隔的数据文件

    我正在尝试读取使用逗号作为分隔符的数据文件 如下所示 IPE 80 764 80 14 8 49 IPE 100 1030 171 15 92 但是如果我阅读使用 READ 1 var1 var2 var3 var4 它将 IPE 和 80
  • 如何为 ASP.NET Core Web API 应用程序的程序和启动 cs 文件编写单元测试

    有没有办法编写单元测试ProgramASP NET Core Web API 的 cs 文件以及类似的startup类 只是为了显示整个应用程序的更多代码覆盖率 目前显示覆盖率为 0 您可以在单独的调用中提取配置并将它们公开到 func 中
  • 当我使用requirements.txt时,pip没有从virtualenv中安装到site-packages目录

    我对使用 virtualenv 运行 Python 还比较陌生 所以这可能是一个简单的解决方案 但我一生都无法弄清楚发生了什么 我运行的是 Windows 7 professional x64 安装了 Python 2 7 5 我已经安装了
  • MatLab 分类数据中的缺失数据处理

    我正在尝试将我的数据集放入 MATLAB ranked weights relieff X Ylogical 10 categoricalx on 函数对我的预测特征的重要性进行排名 这dataset
  • 使用 Powershell 配置 IIS - 启用表单身份验证

    我的 IIS 看起来像这样 Sites gt Default Web Site gt MyWebApp 那么问题是 如何在 MyWebApp 上启用表单身份验证 我设法更改或编辑匿名访问 基本和 Windows 身份验证 然而 Forms
  • pandas:具有多索引的布尔索引

    这里有很多具有类似标题的问题 但我找不到解决这个问题的问题 我有来自许多不同来源的数据帧 我想逐个过滤 当布尔系列与过滤后的数据帧大小相同时 使用布尔索引效果很好 但当该系列的大小与更高级别的索引过滤后的数据帧 简而言之 假设我有这个数据框
  • 如何迭代查询结果

    我正在用 pgsql 脚本语言创建一个函数 此时我想做的是迭代查询的结果 并为每一行执行特定的操作 我当前的尝试如下 其中temprow被声明为temprow user data users rowtype 有问题的代码如下 FOR tem
  • 显示与 main.cpp 不同的类

    我是qt新手 我有一个有多种表格的申请 我试图从 main cpp 中选择特定的表单 但它只是闪烁了表单 但我正在获取表单的调试值 并且表单是不可见的 我的main cpp代码 include dialog h include design
  • Pandas:将操作应用于多索引中的重复列

    我有 MultiColumns 第二级重复包含Job Openings and Hires 我想为每个顶级列减去一个 但我所做的一切都会让我陷入索引错误或切片错误 我怎样才能计算它 样本数据 gt gt gt df head Out 25
  • python中有序字典的有序字典

    我需要一个存储字典的字典数据结构 如下所示 custom 1 a np zeros 10 b np zeros 100 2 c np zeros 20 d np zeros 200 但问题是我在代码中多次迭代这个数据结构 每次迭代它时 我都