繁体   English   中英

如何在Python中剪切一个非常“深入”的json或字典?

[英]How to cut a very “deep” json or dictionary in Python?

我有一个非常深的json对象。 换句话说,我有一个字典,包含多次包含词典的词典等等。 因此,可以将它想象成一棵巨大的树,其中一些节点离根节点很远。

现在我想切割这棵树,这样我就只有从根部分开不超过N步的节点。 有一个简单的方法吗?

例如,如果我有:

{'a':{'d':{'e':'f', 'l':'m'}}, 'b':'c', 'w':{'x':{'z':'y'}}}

我想只保留距离根2步的节点,我应该得到:

{'a':{'d':'o1'}, 'b':'c', 'w':{'x':'o2'}}

所以,我只用单个值替换远端词典。

鉴于您的数据非常深,您可能会在递归时遇到堆栈限制。 这是一种迭代方法,您可以清理和润色一下:

import collections

def cut(dict_, maxdepth, replaced_with=None):
    """Cuts the dictionary at the specified depth.

    If maxdepth is n, then only n levels of keys are kept.
    """
    queue = collections.deque([(dict_, 0)])

    # invariant: every entry in the queue is a dictionary
    while queue:
        parent, depth = queue.popleft()
        for key, child in parent.items():
            if isinstance(child, dict):
                if depth == maxdepth - 1:
                    parent[key] = replaced_with
                else:
                    queue.append((child, depth+1))
def prune(tree, max, current=0):
    for key, value in tree.items():
        if isinstance(value, dict):
            if current == max:
                tree[key] = None
            else:
                prune(value, max, current + 1)

这主要是一个让你入门的例子。 它修剪了字典。 例如:

>>> dic = {'a':{'d':{'e':'f', 'l':'m'}}, 'b':'c', 'w':{'x':{'z':'y'}}}
>>> prune(dic, 1)
>>> dic
{'b': 'c', 'w': {'x': None}, 'a': {'d': None}}

你可以这样做:

initial_dict = {'a':{'d':{'e':'f', 'l':'m'}}, 'b':'c', 'w':{'x':{'z':'y'}}}
current_index = 0
for item in initial_dict.items():
    if isinstance(item[1], dict):
        current_index += 1
        initial_dict[item[0]] = {key:'o'+str(current_index) for key in item[1].keys()}

我相信这段代码的一个问题是,对于多个键控二级dicts(后面的例子),你会获得相同的值,但你可以调整代码来解决它。

例如。:

# suppose you have this dict initially
initial_dict = {'a':{'d':{'e':'f', 'l':'m'}}, 'b':'c', 'w':{'x':{'z':'y'}, 'b':{'p':'r'}}}
# you would get
initial_dict = {'a':{'d':'o1'}}, 'b':'c', 'w':{'x':'o2', 'b':'o2'}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM