说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
itertools.zip_longest() 是 Python 中 itertools 模块提供的一个函数,用于将多个可迭代对象按元素配对。如果可迭代对象长度不等,会使用指定的填充值来填充较短的可迭代对象,以保证输出的配对数等于最长的可迭代对象的长度。itertools.zip_longest() 可以将多个可迭代对象按元素配对生成元组,与内置的 zip() 函数类似,但它会对长度不等的可迭代对象进行填充,使得最终生成的元组数量等于最长的可迭代对象的长度。
语法为itertools.zip_longest(*iterables, fillvalue=None)
创建一个迭代器,从每个可迭代对象中收集元素。如果可迭代对象的长度未对齐,将根据 fillvalue 填充缺失值。迭代持续到耗光最长的可迭代对象。
参数返回值:
*iterables
:一个或多个可迭代对象,如列表、元组、字符串等。注意事项:
大致相当于:
def zip_longest(*args, fillvalue=None):
# zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
iterators = [iter(it) for it in args]
num_active = len(iterators)
if not num_active:
return
while True:
values = []
for i, it in enumerate(iterators):
try:
value = next(it)
except StopIteration:
num_active -= 1
if not num_active:
return
iterators[i] = repeat(fillvalue)
value = fillvalue
values.append(value)
yield tuple(values)
如果其中一个可迭代对象有无限长度,zip_longest() 函数应封装在限制调用次数的场景中(例如 islice() 或 takewhile())。除非指定, fillvalue 默认为 None 。
例如:
import itertools
t = itertools.zip_longest('abcd','xy', fillvalue=3)
[*t]
# [('a', 'x'), ('b', 'y'), ('c', 3), ('d', 3)]
要注意的是,fillvalue 传参时要写参数名。
import itertools
list1 = [1, 2, 3]
list2 = ['a', 'b']
# 使用 zip_longest 将 list1 和 list2 配对
result = itertools.zip_longest(list1, list2)
print(list(result)) # 输出 [(1, 'a'), (2, 'b'), (3, None)]
import itertools
list1 = [1, 2, 3]
list2 = ['a', 'b']
# 使用 zip_longest 将 list1 和 list2 配对,并指定填充值 '-'
result = itertools.zip_longest(list1, list2, fillvalue='-')
print(list(result)) # 输出 [(1, 'a'), (2, 'b'), (3, '-')]
假设我们有两个列表,一个包含学生的名字,另一个包含学生的成绩。这两个列表的长度不一致,我们希望将它们配对,并使用 N/A 作为缺少成绩的填充值。
示例数据:
Copy code
names = ['Alice', 'Bob', 'Charlie']
grades = [85, 90]
目标:
将学生名字和成绩配对,不足的部分用 N/A 填充:
[('Alice', 85), ('Bob', 90), ('Charlie', 'N/A')]
实现代码:
import itertools
names = ['Alice', 'Bob', 'Charlie']
grades = [85, 90]
# 使用 itertools.zip_longest 将 names 和 grades 配对,并指定填充值 'N/A'
result = itertools.zip_longest(names, grades, fillvalue='N/A')
print(list(result)) # 输出 [('Alice', 85), ('Bob', 90), ('Charlie', 'N/A')]
解释:
itertools.zip_longest()
配对名字和成绩:itertools.zip_longest(names, grades, fillvalue='N/A')
将名字列表 names 和成绩列表 grades 按元素配对,使用填充值 N/A 填充较短的列表 grades。这个实用案例展示了如何使用 itertools.zip_longest()
将不同长度的序列对齐并填充缺失值,适用于数据对齐和数据填充的场景。
更新时间:2024-07-04 08:29:23 标签:python zip 迭代 itertools 拉链