[解決済み] Pythonでリストをペア(current, next)として反復処理する。
質問
Pythonで、"current"要素と"next"要素を見てリストを反復する必要があることがあります。今までは、以下のようなコードで行っていました。
for current, next in zip(the_list, the_list[1:]):
# Do something
しかし、同じことをするために、もっと慣用的または効率的な方法はないのでしょうか?
どのように解決するのですか?
の関連例です。 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)
Python 2 の場合は
itertools.izip
の代わりに
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)
この仕組み
まず、2つの並列イテレータ。
a
と
b
が作成されます(
tee()
の呼び出し)で、どちらも元の反復処理可能な要素の先頭を指しています。2番目のイテレータは
b
は1つ前に移動します。
next(b, None)
)の呼び出し)。このとき
a
はs0を指しており
b
は s1 を指す。どちらも
a
と
b
izip 関数は、2 つのイテレータを受け取り、返された要素のペアを作成し、両方のイテレータを同じ速度で進めることができます。
一つ注意点があります。
tee()
関数は、互いに独立して進むことのできる2つのイテレータを生成しますが、それには代償が伴います。もし片方のイテレータがもう片方よりも先に進んでしまったら、その時点で
tee()
は、2 番目のイテレータが消費するまでの間、消費した要素をメモリ内に保持する必要があります (元のイテレータを「巻き戻す」ことはできません)。ここでは、一方のイテレータが他方より1歩進んでいるだけなので問題ありませんが、一般に、この方法では大量のメモリを使用しがちです。
また
tee()
を取ることができます。
n
パラメータを使用すると、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)
関連
-
Python関数の高度な応用を解説
-
python implement mysql add delete check change サンプルコード
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
Python Decorator 練習問題
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python百行で韓服サークルの画像クロールを実現する
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
PythonによるExcelファイルの一括操作の説明
-
Python 入出力と高次代入の基礎知識
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない