我们经常遇到各种字典套字典的数据,例如: nest_dict = { 'a': 1, 'b': { 'c': 2, 'd': 3, 'e': {'f': 4} }, 'g': {'h': 5}, 'i': 6, 'j': {'k': {'l': {'m': 8}}} } 有没有什么简单的办法,把它压扁,变成: { 'a': 1, 'b_c': 2, 'b_d': 3, 'b_e_f': 4, 'g_h': 5, 'i': 6, 'j_k_l_m': 8 } 你肯定想到了使用递归来解决这个问题,那么你可以试一试, 在Python编程中,处理嵌套数据结构,尤其是嵌套字典,经常是一项挑战。当我们需要将这些复杂的结构“压平”成一个扁平化的字典时,递归通常是一个有效的解决方案。然而,这里我们将探讨如何利用`yield`关键字,一个在Python中用于创建生成器的强大工具,以更简洁的方式实现这一目标。 生成器是一种特殊的迭代器,它可以在运行时生成值,而不是一次性生成所有值。`yield`语句是生成器的核心,它暂停函数的执行并将值返回给调用者。当调用者再次请求值时,函数会从上次暂停的地方继续执行。 针对题目中的需求,我们可以创建一个名为`flat`的生成器函数,它接受一个嵌套字典作为输入。该函数遍历字典的键值对,检查值是否是另一个字典。如果是,我们递归调用`flat`函数,并将新键(当前键与子字典键通过下划线连接)和子字典的值组合。如果值不是字典,我们直接`yield`原始键值对。 以下是实现这个功能的8行代码版本: ```python def flat(x): for key, value in x.items(): if isinstance(value, dict): for k, v in flat(value): k = f'{key}_{k}' yield (k, v) else: yield (key, value) ``` 在这个例子中,`flat`函数通过`yield`关键字逐个返回压平后的键值对。当处理嵌套字典时,`yield`允许我们保持函数的状态,使得函数可以记住上一次迭代的位置,从而在下次迭代时从那里继续。 在给定的示例中,输入的嵌套字典`nest_dict`会被转换为: ```python { 'a': 1, 'b_c': 2, 'b_d': 3, 'b_e_f': 4, 'g_h': 5, 'i': 6, 'j_k_l_m': 8 } ``` 这个函数特别适用于处理大型或动态生成的数据结构,因为它避免了一次性加载所有数据到内存中,而是按需生成结果。 此外,这个方法还可以扩展到处理字典与列表混合嵌套的情况,只需要在适当的地方进行调整,以处理列表项并将其与其他键组合。 总结来说,使用`yield`关键字和生成器是处理嵌套字典的一种高效、节省内存的方法。它不仅简化了代码,而且使得代码更易于理解和维护。通过这个简单的例子,我们可以深入理解Python中的生成器和`yield`关键字,这在处理大量数据和复杂数据结构时尤其有用。
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 11
- 资源: 923
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)