【问题标题】:How to extract all values from an embedded dict/list如何从嵌入式字典/列表中提取所有值
【发布时间】:2018-06-30 17:10:52
【问题描述】:

假设我们有以下...

pract={
  "hello": {
    "more": 1,
    "some": 2,
    "yes": [
      {
        "dicct": 1
      },
      {
        "more_dict": 4
      }
    ]
  }
}

我有一个嵌入式dict/list。我需要获取所有单个值。所以在这种情况下,我的结果是......

[1, 2, 1, 4]

理想情况下,我想保留直接父母,这样会更好...

[("more",1), ("some",2), ("dicct", 1), ("more_dict", 4)]

这是我的递归尝试……

def grab_children(father, result):
    if type(father) == type([]):
        for e in father:
            if isinstance(e, dict):
                grab_children(e, result)
    else:
        for child_key, child_value in father.items():
            if isinstance(child_value, dict):
                grab_children(child_value, result)
            else:
                result.append((child_key, child_value))

我就是这样运行的......

child = []
grab_children(pract, child)

但是当我打印子数组时,我得到...

[('more', 1), ('some', 2), ('yes', [{'dicct': 1}, {'more_dict': 4}])]

显然不是我想要的输出。我的解决方案有什么问题?

【问题讨论】:

    标签: python python-3.x dictionary recursion key-value


    【解决方案1】:

    generator 非常适合这种事情:

    代码:

    def get_terminal_nodes(data):
        if isinstance(data, list):
            for item in data:
                for i in get_terminal_nodes(item):
                    yield i
    
        elif isinstance(data, dict):
            for k, item in data.items():
                if isinstance(item, (list, dict)):
                    for i in get_terminal_nodes(item):
                        yield i
                else:
                    yield k, item
    

    测试代码:

    pract = {
        "hello": {
            "more": 1,
            "some": 2,
            "yes": [{"dicct": 1}, {"more_dict": 4}]}
    }
    
    flat_data = dict(get_terminal_nodes(pract))
    print(flat_data)
    

    结果:

    {'more': 1, 'some': 2, 'dicct': 1, 'more_dict': 4}
    

    【讨论】:

    • 这很好用,但是我从未听说过生成器,所以我不知道它是如何工作的。
    • 神奇之处在于yield。通过上面的链接。您可以像使用任何迭代器一样使用它。但基本上它确实会提前返回排序,然后从中断的地方开始。在这种情况下,它们非常灵巧。
    • 是的,这就是我删除评论的原因,我找到了一种适合我的方法。不过感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多