首頁 >後端開發 >Python教學 >如何有效地迭代 Python 列表中的重疊對(或三元組)?

如何有效地迭代 Python 列表中的重疊對(或三元組)?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-16 21:23:11798瀏覽

How Can I Efficiently Iterate Over Overlapping Pairs (or Triples) in a Python List?

在Python 中迭代重疊值對

在Python 中迭代列表,同時考慮「當前」和「下一個」元素是一個共同的需要。傳統上,這是使用以下程式碼實現的:

for current, next in zip(the_list, the_list[1:]):
    # Do something

雖然有效,但這種方法並不是最慣用或最有效的。更Pythonic的解決方案是使用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)

pairwise函數建立兩個並行迭代器,a和b,都指向原始可迭代的第一個元素。然後將 b 前進一步,導致 a 指向 s0,b 指向 s1。然後 zip 函數將 a 和 b 中的元素配對,為您提供重疊的對。

對於Python 2,您可以使用itertools.izip 而不是zip 來獲取惰性迭代器:

import itertools

def pairwise(iterable):
    "s -> (s0, s1), (s1, s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

可以擴展該技術以使用tee 函數的n 參數產生更大的“視窗」。例如,要產生三元組,您可以使用:

def threes(iterator):
    "s -> (s0, s1, s2), (s1, s2, s3), (s2, s3, 4), ..."
    a, b, c = itertools.tee(iterator, 3)
    next(b, None)
    next(c, None)
    next(c, None)
    return zip(a, b, c)

請注意,如果其中一個迭代器比其他迭代器前進得更遠,則使用 tee 可能會消耗記憶體。然而,在迭代器以相同速度前進的情況下,這種方法是記憶體高效且慣用的。

以上是如何有效地迭代 Python 列表中的重疊對(或三元組)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn