使用 Yield 展平字典

Posted

技术标签:

【中文标题】使用 Yield 展平字典【英文标题】:Flatten a Dictionary using Yield 【发布时间】:2021-12-31 17:25:15 【问题描述】:

我的代码如下:

def und1(d):
    for i in d:
        if type(d[i])==dict:
             und1(d[i])
        else:
            yield(i:d[i])
Dict1 = 1: 'Geeks', 2: 'For', 3: 'Geeks',4:5:'wevcn '
for z in  und1(Dict1):
    print(z)

我目前正在获得输出:

1: 'Geeks'
2: 'For'
3: 'Geeks'

预期输出:

    1: 'Geeks'
     2: 'For'
    3: 'Geeks'
    5:'wevcn'

问题:我的函数没有调用递归函数,它返回 null。谁能告诉我为什么?

【问题讨论】:

你打电话给und1(d[i]),但你想改为yield from 它正在调用它。它返回一个生成器,您立即将其丢弃 @Grismar 如果我使用 yield 从它给出 5 但我需要 5:'wencn' ,这就是为什么我想将 d[i] 作为递归函数发送 @juanpa.arrivillaga 为什么会被丢弃?我希望它递归调用直到最后一个嵌套字典 确实递归调用了它。你没有对递归调用的结果做任何事情,所以返回的生成器被丢弃了 【参考方案1】:

你的代码应该使用yield from,可以这样简化:

def und1(d):
    for k, v in d.items():
        if isinstance(v, dict):
            yield from und1(v)
        else:
            yield k: v


dict1 = 1: 'Geeks', 2: 'For', 3: 'Geeks', 4: 5: 'wevcn '
for z in und1(dict1):
    print(z)

isinstance() 特别适用于检查“某物是否为 ...”,通过迭代 .items()dict,您可以轻松访问键和值,因此您不需要不必再次索引dict

输出:

1: 'Geeks'
2: 'For'
3: 'Geeks'
5: 'wevcn '

在您的代码中,从函数返回了一个生成器(因为它确实为非 dict 项目生成了),并且由于您调用了该函数,但没有将函数结果分配给任何东西,所以该生成器被丢弃了。

您可以将函数结果分配给一个变量并对其进行迭代,但不需要您想要的。

【讨论】:

以上是关于使用 Yield 展平字典的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 反转和展平字典

如何展平嵌套的字典并在碰撞时使用内部值

Spark Python Pyspark 如何使用字典数组和嵌入式字典来展平列(sparknlp 注释器输出)

如何使用嵌套字典列表展平熊猫数据框中的列

如何展平(int,dictionary)的字典?

pandas json_normalize 展平嵌套字典