Pythonで2つのリストを並行して繰り返す方法|zip()関数の使い方を解説
2つのリストを並行して繰り返す方法
Pythonでは、複数のリストの要素を同時に処理したい場面がよくあります。ここでは、長さが異なる可能性がある2つのリストを並行して走査する方法を紹介します。
方法1:range()とインデックスを使ったforループ
2つのリストの長さが異なる場合でも、短い方のリストの長さを基準にrange()でループすれば、共通するインデックス範囲を安全に並行走査できます。
>>> L1
['a', 'b', 'c', 'd']
>>> L2
[4, 5, 6]
>>> l = len(L1) if len(L1) <= len(L2) else len(L2)
>>> l
3
>>> for i in range(l):
print(L1[i], L2[i])
a 4
b 5
c 6
この例では、L1は4要素、L2は3要素ですが、短い方(L2)の長さである3回だけループが実行され、対応する要素がペアで出力されます。
方法2:zip()関数を使う(Pythonicな書き方)
よりPythonicな方法は、組み込み関数のzip()を使うことです。zip()は、渡された各イテラブルから要素を集約し、タプルのペアを生成するイテレータを返します。
>>> for i, j in zip(L1, L2):
print(i, j)
a 4
b 5
c 6
zip()を使えば、インデックス計算やリストの長さ比較が不要になり、コードがシンプルで読みやすくなります。なお、zip()は最も短いイテラブルが尽きた時点で反復を停止するため、余分な要素は無視される点に注意してください。
補足:長い方のリストに合わせたい場合はitertools.zip_longest()
短いリスト側の不足分をNoneなどで埋めながら、最も長いリストの長さまで処理したい場合は、標準ライブラリのitertools.zip_longest()が便利です。
>>> from itertools import zip_longest
>>> for i, j in zip_longest(L1, L2):
print(i, j)
a 4
b 5
c 6
d None
まとめ
- 共通するインデックスの要素だけを処理したい → 短い方の長さでrange()を使うか、zip()を使う
- 最も長いリストに合わせて最後まで処理したい → itertools.zip_longest()を使う
特別な理由がない限り、簡潔で可読性の高いzip()を使うのがおすすめです。
-
PythonとTensorFlowで2つの行列を乗算する方法を解説
TensorFlowは、Googleが提供する機械学習フレームワークです。オープンソースとして公開されており、Pythonと組み合わせてアルゴリズムやディープラーニングアプリケーションなどを実装するために利用されています。研究用途から本番運用まで幅広く使われており、複雑な数学的演算を高速に処理できる最適化技術を備えているのが特長です。 その理由の一つは、NumPyと多次元配列を基盤としている点にあります。この多次元配列は「テンソル」と呼ばれます。TensorFlowは深層ニューラルネットワークの構築をサポートし、高いスケーラビリティを持ち、人気のデータセットが多数付属しています。また、GPUに
-
PythonとTensorFlowを使って2つの行列を加算する方法
TensorFlowは、Googleが提供する機械学習フレームワークです。オープンソースとして公開されており、Pythonと組み合わせてアルゴリズムやディープラーニングアプリケーションなどを実装するために広く利用されています。研究用途から本番環境まで幅広い場面で活用されており、複雑な数値計算を高速に実行するための最適化技術が多数搭載されています。この高い処理性能は、NumPyおよび多次元配列の仕組みによって支えられています。これらの多次元配列は「テンソル(tensor)」と呼ばれます。TensorFlowは深層ニューラルネットワークの構築を強力にサポートしており、高い拡張性を持つほか、代表的な