この記事では、Pythonの複数の要素を持つオブジェクトの比較について解説します。
リストや文字列などのシーケンスや辞書なんかも比較を行うことができます。しかし、通常のオブジェクトとは異なる特徴があるのでどのように比較が行われるか知っておく必要があります。
Link比較 - 式 (expression) — Python 3.10.4 ドキュメント
比較演算子については以下の記事を参考にしてください。
それでは、複数の要素を持つオブジェクトの比較について見ていきましょう!
シーケンスの比較
シーケンスの比較には以下のような特徴があります。
- 同じ型同士でしか行えない
- 異なる型同士の等価比較 =
False
- 異なる型同士の順序比較 =
TypeError
また、コレクション同士の比較は以下のように動作する。
- 型、長さ、対応する要素が同じ場合に等価として判定される
- 順序は最初に見つかった等価でない要素と同じになる
- 対応する要素が存在しない場合は短いコレクションの方が先の順序となる
同じ型同士でしか行えない
比較するシーケンスが同じ型でないと要素が同じだとしても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
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つずつは単純なので分解して考えてみましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ