使用 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 展平字典的主要内容,如果未能解决你的问题,请参考以下文章