在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中文網其他相關文章!