Pythono の list の比較演算子


list には比較演算子が定義されていて、
2 つのリストを比較することができます。

◯ 比較演算子って何?

==
!=
<=
<
>=
>
is
is not
in
not in


いやいやリストの大小比較 >, < って何だよって感じですが
そんなに難しいものではありません。

◯ 考え方


各要素は桁を表現している。


1. == 比較演算子

>>> # 123 == 123
>>> [1, 2, 3] == [1, 2, 3]
True
>>>
>>> # 順番が違っていていると False
>>> # 123 == 132
>>> [1, 2, 3] == [1, 3, 2]
False
>>>


リストの先頭の要素から順番に比較する。
これと等価

from itertools import zip_longest
inf = float('inf')

# ==
def equal(lst1, lst2):
    for e1, e2 in zip_longest(lst1, lst2, fillvalue=-inf):
        if e1 == e2:
            continue
        elif e1 < e2:
            return False
        elif e1 > e2:
            return False
    return True


zip_longest は短い方のリストの要素を fillvalue で埋めてくれる。

>>> for e1, e2 in zip([1, 2], [1]):
...     e1, e2
... 
(1, 1)
>>>
>>> for e1, e2 in zip_longest([1, 2], [1], fillvalue=-inf):
...     e1, e2
... 
(1, 1)
(2, -inf)
>>>

2. <= 比較演算子

>>> # 123 <= 123
>>> [1, 2, 3] <= [1, 2, 3]
True
>>> 
>>> # 123 <= 124
>>> [1, 2, 3] <= [1, 2, 4]
True
>>> 
>>> # 423 <= 128
>>> [4, 2, 3] <= [1, 2, 8]
False
>>> 
>>> # 要素数が足りない方は -無限大が代入される
>>> # 123(-無限大) < 123(-10)
>>> [1, 2, 3] <= [1, 2, 3, -10]
True
>>> # 123(-10) <= 123(-無限大)
>>> [1, 2, 3, -10] <= [1, 2, 3]
False
>>>


リストの先頭の要素から順番に比較する。
もし2つの要素が同じ数なら次の要素を比較する。
シーケンス番号の小さい要素の大小比較が優先される。

まず、最初の二つの要素を比較し、その値が等しくなければその時点で比較結果が決まります。等しければ次の二つの要素を比較し、以降シーケンスの要素が尽きるまで続けます。
5.8. シーケンスとその他の型の比較



これと等価

from itertools import zip_longest
inf = float('inf')

# <=
def less_equal(lst1, lst2):
    for e1, e2 in zip_longest(lst1, lst2, fillvalue=-inf):
        if e1 == e2:
            continue
        elif e1 < e2:
            return True
        elif e1 > e2:
            return False
    return True

3. < 比較演算子

# <
def less_than(lst1, lst2):
    # return <= and not ==
    return less_equal(lst1, lst2) and not equal(lst1, lst2)

初等教育では <、> の「(等号を含まない)不等号」を先に導入するが、
数学一般においては等号を含めた
「≤」を先に定義する方が自然な場合が多く、
「<」のほうが「a ≤ b かつ a ≠ b」として定義される。
不等号 | Wikipedia


何でなんですかね..

4. >= 比較演算子

省略

5. > 比較演算子

省略





このあとの in, is 比較演算子は、すこし性格が違います。

6. in 比較演算子

要素がリストに含まれているかを判定する。

>>> 1 in [1, 2, 3]
True
>>>
>>> 4 in [1, 2, 3]
False
>>>

7. is 比較演算子

同じオブジェクトなら True になります。

>>> # 1) 
>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> c = [1, 2, 3]
>>>
>>> # True
>>> #   何故なら、変数 a と 変数 b には
>>> #   同じオブジェクトが代入されているから
>>> a is b
True
>>>
>>> # False
>>> #   何故なら、変数 a と 変数 c には
>>> #   別のオブジェクトが代入されているから
>>> a is c
False
>>>


== 比較演算子とは違います。

>>> # 1) 
>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> c = [1, 2, 3]
>>>
>>> # False
>>> #   何故なら、変数 a と 変数 c には
>>> #   別のオブジェクトが代入されているから
>>> a is c
False
>>>
>>> # True
>>> #   何故なら、変数 a と 変数 c の
>>> #   オブジェクトの値は同じだから
>>> a == c
True
>>>


代入は、コピーではありません。

>>> # 2)
>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> c = [1, 2, 3]
>>>
>>> # 変数 a に代入された
>>> # オブジェクトの要素を1つ pop すると
>>> a.pop()
3
>>> a
[1, 2]
>>>
>>> # 変数 b も変化する。
>>> b
[1, 2]
>>> #   何故なら、変数 a と 変数 b には
>>> #   同じオブジェクトが代入されているから
>>> a is b
True
>>>
>>> # 変数 c は変化しない。
>>> c
[1, 2, 3]
>>> #   何故なら、変数 a と 変数 c には
>>> #   別のオブジェクトが代入されているから
>>> a is c
False
>>>

◯ not ブール演算子

ちなみに is not や not in は、それで1つの比較演算子になります。
not は単体で and や or と仲間のブール演算子になります。
6.11. ブール演算 (boolean operation)

1 is not 1
not 1 is 1
1 not in [1, 2, 3]
not 1 in [1, 2, 3]



list も値として大小関係 >, <, 等号 == が定義されていることがわかりました。では、値とは何でしょうか?