Pythonで2つのリストの同じインデックス位置にある不一致要素を検出する3つの方法
Pythonでは、2つのリストの要素を「値」と「位置(インデックス)」の両方の観点から比較したいケースがあります。例えば、データの差分チェックやテスト結果の検証などがその代表例です。本記事では、2つのリストの中で「同じインデックス位置に存在するのに値が一致しない要素」を検出する方法を、3つの異なるアプローチで解説します。
方法1:forループを使う
forループを使えば、同じインデックス同士の値を1つずつ順番に比較できます。値が一致しなかった場合には、そのインデックスを結果リストに追加していきます。具体的には、forループでまず1つ目のリストから要素を取り出し、if文を使って2つ目のリストの対応する値と比較します。
サンプルコード
listA = [13, 'Mon', 23, 62, 'Sun']
listB = [5, 'Mon', 23, 6, 'Sun']
# インデックス変数
idx = 0
# 結果格納用リスト
res = []
# ループで反復処理
for i in listA:
if i != listB[idx]:
res.append(idx)
idx = idx + 1
# 結果を出力
print("値が一致しないインデックス位置:\n", res)
実行結果
値が一致しないインデックス位置: [0, 3]
この結果から、インデックス0(13 と 5)およびインデックス3(62 と 6)の2箇所で値が一致していないことが分かります。
方法2:zip関数を使う
zip関数を活用すると、各インデックスの要素をペアとして同時に取り出せるため、より短く簡潔なコードを書けます。リスト内包表記と組み合わせることで、値が一致しない位置のインデックスだけを効率よく抽出できます。
サンプルコード
listA = [13, 'Mon', 23, 62, 'Sun']
listB = [5, 'Mon', 23, 6, 'Sun']
res = [listB.index(n) for m, n in
zip(listA, listB) if n != m]
# 結果を出力
print("値が一致しないインデックス位置:\n", res)
実行結果
値が一致しないインデックス位置: [0, 3]
方法3:enumerate関数を使う
enumerate関数を使う方法も、基本的な考え方はzip関数とほぼ同じです。ただしこちらは、片方のリストにenumerate関数を適用することで、forループ内で「要素」と「そのインデックス」を同時に取得しながら処理を進められる点が特徴です。可読性が高く、実務でも広く使われている定番の手法です。
サンプルコード
listA = [13, 'Mon', 23, 62, 'Sun']
listB = [5, 'Mon', 23, 6, 'Sun']
res = [idx for idx, elem in enumerate(listB)
if elem != listA[idx]]
# 結果を出力
print("値が一致しないインデックス位置:\n", res)
実行結果
値が一致しないインデックス位置: [0, 3]
まとめ
2つのリストの同じインデックス位置で値が異なる要素を検出する方法として、以下の3つのアプローチを紹介しました。
- forループ: 処理の流れが分かりやすく、初心者にも理解しやすい
- zip関数: コードが短く、2つのリストを並行して扱える
- enumerate関数: インデックスと要素を同時に取得でき、可読性が高い
用途やコードの読みやすさに応じて、最適な方法を選択してください。なお、これらの方法は2つのリストの長さが同じであることを前提としています。長さが異なる可能性がある場合は、事前にlen()で長さを確認するか、itertools.zip_longest()の利用を検討するとよいでしょう。
-
Pythonでリスト内の要素のインデックス(位置)を取得する方法
Pythonでは、リスト(シーケンス型全般)に含まれる要素の位置を取得するには、index()メソッドを使用します。このメソッドは、指定した要素が最初に出現するインデックスを返します。index()メソッドの基本的な使い方リストに対してindex()を呼び出し、引数に検索したい要素を指定します。>>> L1=[45, 32, 100, 10, 24, 56] >>> L1.index(24) 4この例では、リストL1の中から値24を検索し、その位置であるインデックス4が返されています。Pythonのインデックスは0から始まるため、5番目の要素がインデックス4
-
Pythonでリスト内の要素のインデックスを取得する方法
index()メソッドで最初の出現位置を取得する リスト(文字列やタプルなど、他のシーケンス型でも同様)に用意されている index() メソッドを使うと、特定の要素が最初に出現する位置(インデックス)を簡単に見つけることができます。 >>> L1=[a, b, c, a, x] >>> L1 [a, b, c, a, x] >>> L1.index(a) 0 この例では、リスト L1 の中で a が最初に出現するのはインデックス 0 の位置であるため、0 が返されます。なお、指定した要素がリスト内に存在しない場合は ValueError