python使用yield压平嵌套字典的超简单方法

  • Post category:Python

下面是详细的讲解和示例:

1. 什么是yield?

yield 是 Python 中的一个关键字,用于函数中的生成器(generator)。它的作用是把一个普通函数转化为生成器函数,简单来说就是将普通函数的返回值变成了一个生成器对象。当生成器函数第一次调用时,程序不会执行函数内部的语句,而是返回一个生成器对象,当这个生成器对象调用了 __next__() 方法后,又会继续执行函数内部的语句,然后将执行结果返回,接着程序会一直执行到下一个 yield 关键字,再次将其返回,如此往复,直到函数里面的语句都执行完毕。

2. yield 原理详解

我们可以通过以下代码来理解 yield 的原理:

def simple_generator():
    for i in range(5):
        yield i

gen = simple_generator()
print(next(gen))   #输出 0
print(next(gen))   #输出 1
print(next(gen))   #输出 2
print(next(gen))   #输出 3
print(next(gen))   #输出 4

这段代码中,我们首先定义了一个名为 simple_generator 的生成器函数,函数内部通过 for 循环遍历了一个 range(5),并通过 yield i 将每个 i 返回,将普通函数转换为生成器函数。之后,我们通过 simple_generator() 这个生成器函数创建了一个 gen 生成器对象,并通过 next() 方法逐个输出了生成器函数中 yield 关键字所返回的值。

换句话说,这个生成器函数每次调用 yield 时,就暂停了函数的执行,并返回了一个值,当再次调用这个生成器函数时,函数从上次暂停的位置继续执行,直到遇到下一个 yield 关键字。

3. 使用yield压扁嵌套字典

压扁嵌套字典,也就是将多层嵌套的字典转换成一维的列表,我们可以使用 yield 来处理,下面是具体实现方法:

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

具体解释:

  1. flatten_dict 函数用于接收一个嵌套的字典,通过 yield 生成器将压平后的元素一个个返回。

  2. for k, v in d.items(): 遍历字典的每一个键值对。

  3. if isinstance(v, dict): 判断值是否为字典类型,如果是就递归调用 flatten_dict 函数。

  4. yield (k, v): 否则就将键值对打包成元组,通过 yield 语句返回。

示例1:对于普通的字典,我们可以直接将它转换成列表:

d = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}}
print(list(flatten_dict(d))) 
#输出 [('a', 1), ('b', 2), ('d', 3), ('e', 4)]

示例2:对于嵌套的字典,同样可以通过这个方法解决:

d = {'a': {'b': {'c': {'d': {'e': {'f': 1}}}}}}
print(list(flatten_dict(d))) 
#输出 [('f', 1)]

4. 总结

使用 yield 压扁嵌套字典的方法,可以方便地将多层嵌套的字典转换成扁平的列表,同时避免了通过循环递归来处理嵌套字典时可能出现的栈溢出问题。