Python PR

【Python】複数の要素を持つオブジェクトの比較

記事内に商品プロモーションを含む場合があります

この記事では、Pythonの複数の要素を持つオブジェクトの比較について解説します。

リストや文字列などのシーケンスや辞書なんかも比較を行うことができます。しかし、通常のオブジェクトとは異なる特徴があるのでどのように比較が行われるか知っておく必要があります。

Link比較 - 式 (expression) — Python 3.10.4 ドキュメント

比較演算子については以下の記事を参考にしてください。

オブジェクトを比較する方法【比較演算子】

それでは、複数の要素を持つオブジェクトの比較について見ていきましょう!

シーケンスの比較

シーケンスの比較には以下のような特徴があります。

  • 同じ型同士でしか行えない
  • 異なる型同士の等価比較 = False
  • 異なる型同士の順序比較 = TypeError
rangeは順序比較をサポートしない。

また、コレクション同士の比較は以下のように動作する。

  • 型、長さ、対応する要素が同じ場合に等価として判定される
  • 順序は最初に見つかった等価でない要素と同じになる
  • 対応する要素が存在しない場合は短いコレクションの方が先の順序となる

同じ型同士でしか行えない

比較するシーケンスが同じ型でないと要素が同じだとしてもFalseとして判定されます。

# 同じ値を持つシーケンス
t = (1, 2)
l = [1, 2]

print(t == l)  # False

異なる型同士の順序比較

異なる型同士の順序比較はTypeError

# 同じ値を持つシーケンス
t = (1, 2)
l = [3, 4]

print(t < l)  # TypeError: '<' not supported between instances of 'tuple' and 'list'

型、長さ、対応する要素が同じ場合に等価として判定される

型、長さ、対応する要素が同じでないと等価として判定されない。

l1 = [1, 2, 3]
l2 = [1, 2]
l3 = [1, 2, 3]

print(l1 == l2)  # False
print(l1 == l3)  # True 

順序は最初に見つけた等価でない要素と同じになる

先頭の要素から比較していき、最初に見つけた等価でない要素の順序となる。

l1 = [1, 2, 3]
l2 = [1, 2, 4]
l3 = [1, 2, 2]

print(l1 < l2)  # True   つまり 3 < 4 
print(l1 < l3)  # False  つまり 3 < 2

対応する要素が存在しない場合は短いコレクションの方が先の順序となる

l1 = [1, 2, 3]
l2 = [1, 2]

print(l1 < l2)  # False

要素数が少ない場合でも等価でない要素が存在する場合はそちらの比較が優先される。

l1 = [9]
l2 = [1, 2, 3, 4]

print(l1 < l2)  # False つまり 9 < 1

文字列の比較

文字列の比較の動作は、上記で説明したシーケンスの比較と同じです。

しかし、他のオブジェクトと異なり特徴的なのが、文字列は文字のUnicodeのコードポイントの数としての値(ord()の返り値)を使って比較を行います。

文字コードを取得する方法

例えば、「a」と「b」の比較は以下のように行われます。

s1 = 'a'
s2 = 'b'

ord_s1 = ord(s1)
ord_s2 = ord(s2)

print(f'a:{ord_s1} < b:{ord_s2} = {s1 < s2}')
# a:97 < b:98 = True

文字列になるとシーケンスと同様に先頭の要素から比較していき、最初に見つけた等価でない要素の順序となります。

s1 = 'abc'
s2 = 'abd'

print(s1 < s2)  # True つまり ord('c') < ord('d')

リストなんかと組み合わさっているとわかりづらいので注意してください。

辞書の比較

辞書の比較は、同じ要素(key、Value)を持っていれば等価として判定できます。

d1 = {'name': 'Mike', 'age': 20}
d2 = {'name': 'John', 'age': 20}
d3 = {'name': 'Mike', 'age': 19}
d4 = {'name': 'Mike', 'age': 20}

print(d1 == d2)  # False
print(d1 == d3)  # False
print(d1 == d4)  # True
順序比較はTypeError

KeyやValueのみで比較したい場合は、keysメソッドやvaluesメソッドを使います。

d1 = {'name': 'Mike', 'age': 20}
d2 = {'name': 'John', 'age': 20}

print(d1.keys() == d2.keys())      # True
print(d1.values() == d2.values())  # False

まとめ

この記事では、複数の要素を持つオブジェクトの比較について解説しました。

複数の要素を持つオブジェクトの比較は、色々なオブジェクトが組み合わさった場合に難しく見えてしまいますが、1つずつは単純なので分解して考えてみましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ