首页 > 后端开发 > Python教程 > 如何在 Python 中有效地迭代列表值的重叠对(或 N 元素窗口)?

如何在 Python 中有效地迭代列表值的重叠对(或 N 元素窗口)?

Mary-Kate Olsen
发布: 2024-12-22 17:48:15
原创
335 人浏览过

How Can I Efficiently Iterate Over Overlapping Pairs (or N-element Windows) of List Values in Python?

迭代重叠的列表值对

迭代 Python 列表时,通常需要访问当前元素和后续元素。虽然使用 zip 函数对连续值进行配对是有效的,但可能还有更有效的方法。

使用pairwise() 函数

Python 3.8 提供了 itertools。 pairwise() 函数,它将可迭代的连续元素配对:

import itertools

def pairwise(iterable):
    "s -> (s0, s1), (s1, s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)
登录后复制

此函数创建两个迭代器 a 和 b,指向输入可迭代对象的第一个元素。 b 前进一步,导致 a 指向当前元素,b 指向下一个元素。然后使用 zip 对两个迭代器中的元素进行配对。

用法示例:

the_list = ['a', 'b', 'c', 'd']

for current, next in pairwise(the_list):
    print(current, next)

# Output:
# a b
# b c
# c d
登录后复制

注意事项:

值得注意的是,pairwise() 通过多次迭代可迭代来发挥作用。这意味着,如果一个迭代器的前进速度明显快于其他迭代器,则实现可能会将消耗的元素保留在内存中,以确保它们可供所有迭代器使用。

N 元素 Windows 的其他选项

pairwise() 函数可以扩展以创建任意大小的窗口:

def n_wise(iterable, n):
    "s -> (s0, s1, ..., s(n-1)), (s1, s2, ..., s(n)), ..."
    iterators = itertools.tee(iterable, n)
    for i in range(1, n):
        next(iterators[i], None)
    return zip(*iterators)
登录后复制

例如,迭代列表中的三元组:

for triplet in n_wise(the_list, 3):
    print(*triplet)

# Output:
# a b c
# b c d
登录后复制

结论:

虽然使用 zip 迭代重叠对的传统方法是可行的,但pairwise() 和 n_wise 函数提供一种简洁有效的方法来为任何大小的窗口实现相同的结果。

以上是如何在 Python 中有效地迭代列表值的重叠对(或 N 元素窗口)?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板