コンテナに < 演算子を使った結果として想像がつきやすいのが、いわゆる「辞書順」でしょう。
最も典型的な 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 件のコメント:
コメントを投稿