Categories: Python

【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 

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

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

print(l1 

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

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

print(l1 

文字列の比較

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

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

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

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

s1 = 'a'
s2 = 'b'

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

print(f'a:{ord_s1} 

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

s1 = 'abc'
s2 = 'abd'

print(s1 

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

辞書の比較

辞書の比較は、同じ要素(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つずつは単純なので分解して考えてみましょう!

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

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago