Python递归打印嵌套哈希

2024-09-27 04:29:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Python打印嵌套哈希,如下所示:

example_dict = {
    'key1' : 'value1',
    'key2' : {
        'key2a': 'value2a'
    },
    'key3' : {
        'key3a': {
            'key3aa': 'value3aa',
            'key3ab': 'value3ab',
            'key3ac': 'value3ac'
        },
        'key3b': [
            'value3b1',
            'value3b2'
        ]
    },
}

对这样的事情:

key1 value1
key2 key2a value2a
key3 key3a key3aa value3aa
key3 key3a key3ab value3ab
key3 key3a key3ac value3ac
key3 key3b value3b1
key3 key3b value3b2

我对Python还不是很熟悉,几个小时后我仍然被困在这里。你知道吗

我目前正在处理这个函数:

def recursive(src, res, line = ''):
    if isinstance(src, dict):
        for key, value in src.items():
            line += str(' ' + key)
            recursive(value, res, line)
    elif isinstance(src, list):
        for litem in src:
            recursive(litem, res, line)
    else:
        line += str(' ' + str(src))
        res.append(line)

我试图将每一行添加到一个列表中,以便以后使用它,但我认为我没有正确的方法来处理共享变量(line),因为在每个dict中,递归调用都是使用同一深度级别的另一个dict键进行的,所以我得到了以下结果:

 key3 key3a key3aa value3aa
 key3 key3a key3aa key3ac value3ac
 key3 key3a key3aa key3ac key3ab value3ab
 key3 key3a key3b value3b1
 key3 key3a key3b value3b2
 key3 key2 key2a value2a
 key3 key2 key1 value1

什么是Python式的方法?你知道吗


Tags: srclineresdictkey2key1value1key3
3条回答

使用generator^{}语句)可以递归地执行以下操作:

代码:

def recursive(src, so_far=()):
    if isinstance(src, dict):
        for key, value in src.items():
            yield from recursive(value, so_far + (key,))
    elif isinstance(src, list):
        for item in src:
            yield from recursive(item, so_far)
    else:
        yield ' '.join(so_far + (src,))

需要注意的一点是需要从递归到的生成器中重新生成结果。在这里使用:

yield from recursive(item, so_far)

相当于:

for i in recursive(item, so_far):
    yield i

测试代码:

example_dict = {
    'key1': 'value1',
    'key2': {
        'key2a': 'value2a'
    },
    'key3': {
        'key3a': {
            'key3aa': 'value3aa',
            'key3ab': 'value3ab',
            'key3ac': 'value3ac'
        },
        'key3b': [
            'value3b1',
            'value3b2'
        ]
    },
}

for line in recursive(example_dict):
    print(line)

结果:

key1 value1
key2 key2a value2a
key3 key3a key3aa value3aa
key3 key3a key3ab value3ab
key3 key3a key3ac value3ac
key3 key3b value3b1
key3 key3b value3b2

非常简单的递归实现。你知道吗

def pr(t, pref=''):
    for k, v in t.items():
        if isinstance(v, dict):
            pr(v, pref=(pref + k + ' '))
        elif isinstance(v, list):
            for el in v:
                if isinstance(el, str):
                    print(pref + ' ' + k + ' ' + el)
                else:
                    pr(el, pref=k + ' ')
        else:
            print(pref + ' ' + k + ' ' + v)

我得到了这个工作,但它有点黑客,使用append添加一个元素,extend添加列表中的所有元素。希望能有帮助:

def recursive(src, start=""):
    lst = []
    for k, v in src.items():
        new_start = "{} {}".format(start, k)
        if isinstance(v, dict):
            lst.extend(recursive(v, start=new_start))
        elif isinstance(v, list):
            lst.extend("{}: {}".format(new_start[1:] , val) for val in v)
        else:
            lst.append("{}: {}".format(new_start[1:] , v))

    return lst


items = recursive(example_dict)
for item in items:
    print(item)

输出:

 key1: value1
 key2 key2a: value2a
 key3 key3a key3aa: value3aa
 key3 key3a key3ab: value3ab
 key3 key3a key3ac: value3ac
 key3 key3b: value3b1
 key3 key3b: value3b2

相关问题 更多 >

    热门问题