ホームページ >バックエンド開発 >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

このアプローチは効果的ではありますが、最も慣用的でも効率的でもありません。より 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。