ホームページ >バックエンド開発 >Python チュートリアル >Python リスト内の重複するペア (またはトリプル) を効率的に反復するにはどうすればよいですか?
Python で重複する値のペアを反復処理する
Python で「現在」要素と「次の」要素の両方を考慮しながらリストを反復処理することは、次のとおりです。共通のニーズ。従来、これは次のようなコードを使用して実現されてきました。
for current, next in zip(the_list, the_list[1:]): # Do something
このアプローチは効果的ではありますが、最も慣用的でも効率的でもありません。より Python 的な解決策は、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)
ペアワイズ関数は、元の反復可能オブジェクトの最初の要素を指す 2 つの並列反復子 a と b を作成します。次に、b を 1 ステップ進めて、a が s0 を指し、b が s1 を指すようになります。次に、zip 関数は a と b の要素をペアにして、重複するペアを作成します。
Python 2 の場合、zip の代わりに itertools.izip を使用して遅延反復子を取得できます。
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)
反復子の 1 つが他の反復子よりも先に進むと、tee を使用するとメモリが消費される可能性があることに注意してください。ただし、反復子が同じペースで進む場合、このアプローチはメモリ効率が高く、慣用的です。
以上がPython リスト内の重複するペア (またはトリプル) を効率的に反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。