【问题标题】:Flatten a Dictionary using Yield使用 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 为什么会被丢弃?我希望它递归调用直到最后一个嵌套字典
  • 确实递归调用了它。你没有对递归调用的结果做任何事情,所以返回的生成器被丢弃了

标签: python python-3.x recursion


【解决方案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 项目生成了),并且由于您调用了该函数,但没有将函数结果分配给任何东西,所以该生成器被丢弃了。

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

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多