使用 Python 生成器展平不规则列表
展平任意嵌套的列表列表的问题很常见,但现有的解决方案经常因深度问题而失败嵌套结构。特别是,像 [[[1, 2, 3], [4, 5]], 6] 这样的列表无法使用大多数解决方案进行展平。
以下函数基于另一个问题的解决方案,可以有效地展平此类列表:
def flatten(x): result = [] for el in x: if hasattr(el, "__iter__") and not isinstance(el, basestring): result.extend(flatten(el)) else: result.append(el) return result
但是,虽然此函数有效,但可以使用生成器在可读性和性能方面进行改进
带有可迭代 ABC 的 Python 2
from collections import Iterable def flatten(xs): for x in xs: if isinstance(x, Iterable) and not isinstance(x, basestring): for item in flatten(x): yield item else: yield x
带有可迭代 ABC 和 Yield From 的 Python 3
from collections.abc import Iterable def flatten(xs): for x in xs: if isinstance(x, Iterable) and not isinstance(x, (str, bytes)): yield from flatten(x) else: yield x
这些基于生成器的解决方案提供了一种更简洁、更有效的方法来展平不规则列表。它们的工作原理是迭代列表中的每个元素并递归地生成子列表的元素。任何不可迭代的元素(例如数字或字符串)都会立即生成。
以上是Python 生成器如何有效地展平任意嵌套列表?的详细内容。更多信息请关注PHP中文网其他相关文章!