【问题标题】:Recursively Access Item In Python Dictionary of Unknown Dimensions递归访问未知维度的Python字典中的项目
【发布时间】:2013-03-05 07:10:54
【问题描述】:

我正在尝试获取对象列表并根据对象的“键”将它们重新排列到嵌套字典的字典中。每个键以已知模式包含其父字典的键。我遇到的问题是能够访问像...这样的元素

hier_data['1']['Assets']['1.2']['Assets']['1.2.3']['Assets']['1.2.3.4']['Assets']

...动态添加。有没有办法构建某种递归函数,该函数将根据键遍历字典?例如,如果我需要使用键“1.2.3.4.5”添加对象,有没有办法...

hier_data['1']['Assets']['1.2']['Assets']['1.2.3']['Assets']['1.2.3.4']['Assets']['1.2.3.4.5'] = {...}

...动态和递归?

我应该注意,我开始的列表是按键排序的,因此我应该始终拥有当前对象的父级“资产”字典可用于添加。

【问题讨论】:

  • 当然,但是...为什么要这样存储它而不是 hier_data['1.2.3.4.5']['Assets']?
  • 这是一个脆弱的数据结构。考虑一棵树...
  • @DavidRobinson,我正在尝试输出数据结构的嵌套 JSON,以便可以在客户端绘制嵌套
  • 。
  • @drewk,“树”是什么意思?我确信有更好的方法可以做到这一点,我只是不知道。
  • 标签: python recursion dictionary


    【解决方案1】:

    您可以使用递归defaultdict:

    >>> from collections import defaultdict
    >>> l = lambda: defaultdict(l)
    >>> d = defaultdict(l)
    >>> d['123']['4234']['asd']['dsaf'] = 4
    >>> d
        defaultdict(<function <lambda> at 0x15f9578>, {'123': defaultdict(<function <lambda> at 0x15f9578>, {'4234': defaultdict(<function <lambda> at 0x15f9578>, {'asd': defaultdict(<function <lambda> at 0x15f9578>, {'dsaf': 4})})})})
    

    【讨论】:

    • 谢谢。我不知道defaultdict。这会很有帮助,除了我的键是排序的,所以我永远不会遇到我没有特定条目的父键的情况。我真正要寻找的是如何动态地获取赋值链 ['1']['23']['456']['7890']... 而不必在代码中包含每个括号。另外,我在学习时发现了这种优雅的写作方式:gist.github.com/hrldcpr/2012250
    【解决方案2】:

    事实证明,我遇到的问题比我想象的要简单。我需要做的就是这样:

    hier_data = {}
    for id in sorted(data.iterkeys()):
      key = id.split('.')
      data[id]['Assets'] = {}
      insert_point = hier_data
      for i in range(len(key)/2-1):
        insert_point = insert_point['.'.join(key[0:2*i+2])]['Assets']
      insert_point[id] = data[id]
    return hier_data
    

    我认为从字典中获取键(例如hier_data[...])会在字典中返回对象的副本,而不是指向对象的指针。事实证明,我只需要遍历我的分解键,将我的 insert_point 光标移动到正确的位置以添加到我的对象中。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签