1. ホーム
  2. パイソン

[解決済み】リスト内の2つの要素ごとに繰り返し処理を行う【重複あり

2022-04-04 13:32:34

質問

<余談
この質問には、すでにここで回答があります :
クローズド 10ヶ月前 .

を作るにはどうしたらいいのでしょうか? for ループかリスト内包で、繰り返しごとに2つの要素が得られるようにするか?

l = [1,2,3,4,5,6]

for i,k in ???:
    print str(i), '+', str(k), '=', str(i+k)

出力します。

1+2=3
3+4=7
5+6=11

どのように解決するのですか?

が必要です。 pairwise() 又は grouped() ) を実装しています。

def pairwise(iterable):
    "s -> (s0, s1), (s2, s3), (s4, s5), ..."
    a = iter(iterable)
    return zip(a, a)

for x, y in pairwise(l):
   print("%d + %d = %d" % (x, y, x + y))

あるいは、もっと一般的に

def grouped(iterable, n):
    "s -> (s0,s1,s2,...sn-1), (sn,sn+1,sn+2,...s2n-1), (s2n,s2n+1,s2n+2,...s3n-1), ..."
    return zip(*[iter(iterable)]*n)

for x, y in grouped(l, 2):
   print("%d + %d = %d" % (x, y, x + y))

Python 2 では、インポートする必要があります。 izip を、Python 3 の組み込みの zip() 関数を使用します。

すべてのクレジットは マティーノ について 彼の答え 質問 この方法は、リストに対して一度だけ反復処理を行い、その過程で不要なリストを作成しないので、非常に効率的であることがわかりました。

N.B : と混同しないでください。 pairwise レシピ をPythonの独自の itertools ドキュメンテーション となり、その結果 s -> (s0, s1), (s1, s2), (s2, s3), ... で指摘されているように をクリックします。 をコメントで紹介しました。

でタイプチェックを行いたい方のためのちょっとした補足です。 マイピー をPython 3上で使用することができます。

from typing import Iterable, Tuple, TypeVar

T = TypeVar("T")

def grouped(iterable: Iterable[T], n=2) -> Iterable[Tuple[T, ...]]:
    """s -> (s0,s1,s2,...sn-1), (sn,sn+1,sn+2,...s2n-1), ..."""
    return zip(*[iter(iterable)] * n)