ホームページ > バックエンド開発 > Python チュートリアル > Python リストで重複するペア (およびトリプル) を効率的に反復するにはどうすればよいですか?

Python リストで重複するペア (およびトリプル) を効率的に反復するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-22 06:00:18
オリジナル
807 人が閲覧しました

How to Efficiently Iterate Over Overlapping Pairs (and Triples) in Python Lists?

リストから重複する値のペアを反復する方法

Python でリストを操作する場合、多くの場合、ペアの値を反復する必要があります。一般的なアプローチは、次のような構成を使用することです。

for current, next in zip(the_list, the_list[1:]):
    # Do something
ログイン後にコピー

このコードは機能しますが、itertools モジュールのペアワイズ関数を使用する、より慣用的で効率的な解決策があります。改訂された Python 3.8 実装は次のとおりです。

import itertools

def pairwise(iterable):
    "s -> (s0, s1), (s1, s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)
ログイン後にコピー

Python 2 の場合、zip の代わりに itertools.izip を使用します (Python 2 の zip は遅延反復子の代わりにリストを作成するため)。

ペアワイズ関数は、同じ最初の要素を指す 2 つの並列反復子 a と b を作成することによって機能します。次に、next を使用して b を 1 つ先に進めます。 izip 関数は、2 つの反復子の要素を結合して重複するペアを形成します。

このアプローチは、より大きな値の「ウィンドウ」を処理するように一般化することもできます。たとえば、値のトリプルを反復処理するには、次の関数を使用します。

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 つが他の反復子よりも先に進む場合は、 next を使用すると、実装はすべての反復子が消費するまで、消費された要素をメモリ内に保持します。

以上がPython リストで重複するペア (およびトリプル) を効率的に反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート