Inilah contoh yang relevan dari dokumen modul itertools :
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
Untuk Python 2, Anda perlu itertools.izipbukannya 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)
Bagaimana ini bekerja:
Pertama, dua iterator paralel, adan bdibuat ( tee()panggilan), keduanya menunjuk ke elemen pertama dari iterable asli. Iterator kedua, bdigerakkan 1 langkah ke depan ( next(b, None)panggilan) panggilan. Pada titik ini menunjuk ake s0 dan bmenunjuk ke s1. Keduanya adan bdapat melintasi iterator asli secara independen - fungsi izip mengambil dua iterator dan membuat pasangan elemen yang dikembalikan, memajukan kedua iterator pada kecepatan yang sama.
Satu peringatan: tee()fungsi ini menghasilkan dua iterator yang dapat maju secara independen satu sama lain, tetapi harus dibayar. Jika salah satu iterator bergerak lebih jauh dari yang lain, maka tee() perlu menyimpan elemen yang dikonsumsi dalam memori sampai iterator kedua juga mengkonsumsinya (iterator tidak dapat 'memundurkan' iterator asli). Di sini tidak masalah karena satu iterator hanya 1 langkah di depan yang lain, tetapi secara umum mudah menggunakan banyak memori dengan cara ini.
Dan karena tee()dapat mengambil nparameter, ini juga dapat digunakan untuk lebih dari dua iterator paralel:
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)