2019年7月21日

コンテナと < 演算子

Python のコンテナに対して < 演算子を使った場合の結果をまとめてみます。


コンテナに < 演算子を使った結果として想像がつきやすいのが、いわゆる「辞書順」でしょう。
最も典型的な str に対する < 演算子の結果は以下のようになります。

>>> 'cnv' < 'conv' < 'convert'
True

関数として実装すると、以下のようになるでしょうか。
def lt(lhs, rhs):
    for i, j in zip(lhs, rhs):
        if i < j:
            return True
        elif j < i:
            return False
    return len(lhs) < len(rhs)
この辞書順は、str 以外にも list、tuple、bytes に適用されます。
# listも辞書順
>>> [1, 2] < [1, 2, 3] < [1, 3, 2]
True




続いて、set に対する < 演算子の結果を見てみましょう。
>>> {1, 2} < {1, 2, 3}
True
>>> {1, 2} < {1, 3, 4}
False
>>> {1, 2} < {1, 2}
False
ここで < 演算子は、数学の真部分集合(記号だと⊂)を表しています。
set には順番という概念がないので、< とは異なる記号の意味となるわけですね。
(ちなみに、<= 演算子は部分集合(記号だと∈)を表します。)

関数として実装すると、以下のようになるでしょうか。

def lt(lhs, rhs):
    return (len(lhs) != len(rhs)) and all(i in rhs for i in lhs)




さらに、dict に対する < 演算子の結果を見てみましょう。
>>> {1: 1} < {1: 1}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'dict' and 'dict'
TypeError となりました。dict はそもそも < 演算子に対応していないということになります。
言われてみれば、dict に < 演算子を適用したとして、結果が想像できませんよね。

同じように range も < 演算子に対応していません。
>>> range(5) < range(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'range' and 'range'




一口に < 演算子と言っても、コンテナの種類によって演算結果は様々です。
< 演算子はデフォルトでのソートに直結しますので、この結果は頭に入れておきたいですね。

0 件のコメント:

コメントを投稿