Python-Itertools.zip_longest()


简介

在编程领域,熟练性和灵活性是工程师努力实现的关键要素。Python 是一种以其简洁性和一致性而闻名的语言,它提供了许多内置函数来帮助实现这些目标。其中一个函数是 `itertools.zip_longest()`,它定义在 Python 的 `itertools` 模块中,在处理长度不等的迭代器方面发挥着重要作用。在本文中,我们将深入探讨 `itertools.zip_longest()` 的内部工作原理,研究其优点、用例、挑战以及针对不同应用的建议。

Itertools.zip_longest() 解释?

`zip_longest()` 函数通过将多个迭代器“压缩”成元组来组合它们。它通过利用称为同步的算法范式来实现这一点。

在并行算法中,同步是指通过阻塞直到多个线程到达一个共同点来协调并发进程。`zip_longest()` 使用这种方法并行化迭代器的使用。理论上,`zip_longest()` 实现了一种会合迭代器模式。它同步地推进多个迭代器,暂停对速度较快的迭代器的使用以保持同步。这使得跨迭代器的输出生成保持一致。

当迭代器长度不一致时,同步需要用填充值来填充较短的迭代器以匹配最长长度。`zip_longest()` 通过使用可配置的填充值来处理这个问题,默认为 `None`。从数学角度来看,这构成了迭代器之间的笛卡尔积,填充类似于关系代数中的交叉连接。两个集合的笛卡尔积包含它们所有可能的顺序对。

因此,`zip_longest()` 可以用集合论来建模为一个填充的笛卡尔积。它灵活地适应具有不均匀集合的现实世界迭代环境的笛卡尔积。从计算的角度来看,`zip_longest()` 对长度为 N 的 k 个迭代器的时间复杂度为 O(k*N),因为每个元素都会被访问。空间复杂度为 O(k) 用于输出。

itertools.zip_longest() 是 Python 的 itertools 模块提供的函数,它解决了常见的编程难题:

组合可能长度不同的多个迭代器,同时保证其元素的平滑排列。当您处理可能没有相同数量元素的数据源时,它特别有用,并且您希望以绑定的方式准备或分析它们。

itertools.zip_longest() 的核心思想是创建一个迭代器,该迭代器产生包含来自输入迭代器元素的元组。这些元组的构建方式考虑了输入迭代器长度的变化。如果一个迭代器比其他迭代器长,则保留多余的元素,而从较短的迭代器中丢失的元素将用指定的填充值填充。

语法

zip_longest(*iterables, fillvalue=None)

它将任意数量的迭代器作为位置参数。可选的 `fillvalue` 参数指定当迭代器短于最长迭代器时使用的填充值。默认情况下,使用 `None` 作为填充值。

`zip_longest()` 返回一个包含从传入迭代器中配对的元素的元组的迭代器。它内存效率高,因为输入是惰性消费的。

示例 1

from itertools import zip_longest

nums1 = [1, 2, 3] 
nums2 = [10, 20]

print(list(zip(nums1, nums2))) 
# [(1, 10), (2, 20)] 

print(list(zip_longest(nums1, nums2)))
# [(1, 10), (2, 20), (3, None)]

输出

[(1, 10), (2, 20)]
[(1, 10), (2, 20), (3, None)]

示例 2

from itertools import zip_longest

keys = ['name', 'age', 'city']
data = [['John'], ['25'], ['New York', 'Chicago']]

records = [dict(zip_longest(keys, parts, fillvalue=''))  
   for parts in data]

print(records)

# [{'name': 'John', 'age': '', 'city': ''},  
#  {'name': '', 'age': '25', 'city': ''},
#  {'name': '', 'age': '', 'city': 'New York'}]

输出

[{'name': 'John', 'age': '', 'city': ''}, {'name': '25', 'age': '', 'city': ''}, {'name': 'New York', 'age': 'Chicago', 'city': ''}]

应用和意义

itertools.zip_longest() 的应用意义在不同的领域中得到了增强。在机器学习的数据预处理中,其中提取包括合并不同的数据源,该函数展示了其效用。此外,在自然语言处理中,结合长度不同的序列,例如句子及其相应的评价名称,与 itertools.zip_longest() 兼容。

结论

`zip_longest()` 在压缩长度不一致的迭代器时提供了更多控制。填充、方向控制和填充值自定义功能允许干净地处理不同的迭代器。它是一个方便的工具,用于在 Python 的迭代、推导和映射中以编程方式整齐地合并、配对和处理长度不匹配的数据。虽然 `zip()` 适用于长度相等的用例,但 `zip_longest()` 提供了灵活性,使其非常适合涉及非对称性的现实世界数据整理任务。

更新于:2023年10月23日

243 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告