使用yield实现字典扁平化时递归调用未生效问题求助
问题根因
- 你定义的
und1是生成器函数,调用该函数只会返回生成器对象,不会自动执行内部逻辑、也不会自动把递归生成的元素传递到上层生成器。现有代码中碰到嵌套字典时仅执行了und1(d[i])创建生成器对象,没有消费该生成器的任何元素,因此嵌套字典的内容不会被外层迭代器获取到。
解决方案
方案1:使用yield from(Python 3.3及以上版本支持)
直接通过yield from语法将递归生成器的所有元素透传到上层,代码修改如下:
def und1(d): for i in d: if type(d[i])==dict: yield from 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)
方案2:手动遍历递归生成器(全Python版本兼容)
手动迭代递归调用返回的生成器,逐个yield每个元素,代码修改如下:
def und1(d): for i in d: if type(d[i])==dict: for item in und1(d[i]): yield item else: yield({i:d[i]}) Dict1 = {1: 'Geeks', 2: 'For', 3: 'Geeks',4:{5:'wevcn '}} for z in und1(Dict1): print(z)
两种方案运行后均可得到你预期的输出。
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

