Pythonでリストを比較するには、大きく分けて2通りの方法があります。
複数のリストの要素と、その並びがともに同じかどうかを比較するには「==」演算子を使います。一方で、要素だけを比較したい場合は、リストをsetに変換して比較を行います。
それぞれ詳しく解説しているので、ぜひ参考にして頂ければと思います。
1. 要素とその並びの比較(==演算子)
リストに含まれている要素が同じかどうかは、比較演算子の「==」を使います。
「==」演算子でリストを比較すると、要素と、その並びが一致する場合にTrueを返し、そうでない場合はFalseを返します。早速見てみましょう。
なお演算子については「Pythonの演算子」をご確認ください。
nums_a = [1, 2, 3]
nums_b = [1, 2, 3]
nums_c = [2, 3, 1]
print(nums_a == nums_b)
print(nums_a == nums_c)
nums_aとnums_bは要素もその並びも全く同じなのでTrueになり、nums_aとnums_cは要素は同じですがその並びが異なるのでFalseになります。
2. 要素のみ比較(setに変換して比較)
あるリストと別のリストの要素の並びは置いておいて、要素そのものが同じかどうかを確認したい場合は、set()関数でリストをset(集合)に変換してから「==」演算子で比較します。
次のコードをご覧ください。
nums1 = [1, 2, 3]
nums2 = [3, 2, 1]
nums3 = [2, 3, 1]
nums4 = [1, 2, 3, 4]
# それぞれset関数でsetに変換してから比較
print(set(nums1) == set(nums2))
print(set(nums1) == set(nums3))
print(set(nums1) == set(nums4))
要素の並びは関係なく、同じ値なのかどうかで比較結果が判定されていますね。
なぜsetに変換すると要素の並びが関係なくなるのかわかるでしょうか。それは、リストは一つひとつの要素にインデックス番号(順番)をつけて格納するのに対して、setは要素の順番は関係なく値のみを格納するからです。そのため、setに変換すると要素の値のみを比較することになります。
なお、Pythonのsetでは、便利な集合演算を実行することができます。これを使って、そのためリストをsetに変換することによって、以下の方法でリストを比較することが可能になります。
- それぞれのリストに存在する要素は何か(和集合)
- 一方のリストにしかない要素は何か(差集合)
- お互いのリストに共通する要素は何か(積集合)
- 一方にしかない要素は何か(対称差集合)
それぞれ見ていきましょう。なお、集合演算については、詳しくは「Pythonのsetの基本知識」をご覧ください。
2.1. 比較するリストに含まれている全ての要素を確認
setの和集合を使うと、それぞれのリストに含まれている全ての要素を調べることができます。和集合演算を行う時は「|」演算子を使います。
nums1 = [1, 2, 3, 4, 5]
nums2 = [3, 4, 5, 6, 7]
print(set(nums1) | set(nums2))
nums1とnums2に存在する全ての要素が分かりますね。
ただし、setを使った集合演算全てに共通することですが、この方法では、同じ値の要素が複数ある場合は、その個数までは分かりません。概念上、set(集合)には値が同じ要素が複数存在するようには、数学的に設計されていないからです。
なお集合演算の返り値は辞書型なので、リストにしたい時は、次のようにlist()関数で変換します。
list(set(nums1) | set(nums2))
2.2. 一方のリストにしかない要素を調べる
差集合を使うと、それぞれのリストの一方にしかない要素を調べることができます。差集合の計算には「-」演算子を使います。次のコードをご覧ください。
print(set(nums1) - set(nums2))
print(set(nums2) - set(nums1))
最初の式ではnums1にしかない要素を、次の式ではnums2にしかない要素が分かりますね。このように差集合演算では、式の左辺にしかない要素が出てきます。
2.3. お互いのリストに共通する要素を調べる
積集合を使うと、お互いのリストに共通して存在する要素を調べることができます。積集合の計算には「&」演算子を使います。
print(set(nums1) & set(nums2))
nums1とnums2に共通する要素が分かりますね。
2.4. 一方のリストにしかない要素を調べる
対称差集合を使うと、それぞれのリストにしか存在しない要素を調べることができます。次のコードをご覧ください。
print(set(nums1) ^ set(nums2))
nums1にしかない要素と、nums2にしかない要素が同時に表示されていますね。
3. まとめ
リストを比較するには、基本的には「==」演算子を使います。この場合、リストの要素と、その並びの両方が同じである場合にTrueを返します。
もし、要素のみを比較したい場合は、リストをset()関数でsetに変換してから比較を行います。setは順序を持たないオブジェクトであることから、この方法が可能になります。またsetで使用できる集合演算を知っておくと、様々な比較ができますので、ぜひ覚えておきましょう。
コメント
コメント一覧 (1件)
Excel VBAが複雑なコードとなり、保守が心配になりましたが
この記事のおかげでPythonでのリストの比較方法について理解できました。
週末、Pandas・NumpyやSQLでのリスト比較の方法やアルゴリズムの学習を
検討していましたがこんなに便利な方法があるとは・・・。
すぐにコードを実行して確認させていただきました。
Youtube動画でもこのような内容は見つけられなかったので
とてもいい記事だと思います。
ありがとうございました。