72103


PythonでJupyterで下を実行しました。

[code]

    'Matplotlib' > 'NumPy' > 'pandas' > 'scikit-learn'
    
[/code]

がFalseになる理由が分かりません。

[code]

    ('bb', 'c') > ('bcd', 'a')
    
[/code]

がFalseになる理由が分かりません。

ご指導よろしくお願いいたします。


CC BY-SA 4.0
2020-11-20T13:44:03.070
72100
2020-11-20T14:43:10.013
34450
question
python
シーケンスの比較


それはPythonが文字列を辞書式順序で比較しているからです

辞書式順序とは、"A"<"B"<"C"みたいなやつのことです。文字数が違う場合は、仮想的に最弱の文字が後ろに無限に続いているとみなして比較します。なので例えば"sta"<"stack"となります

このサイトが初学者にも分かりやすいと思います：  
[1]: <https://math-
souko.jp/%E8%BE%9E%E6%9B%B8%E5%BC%8F%E9%A0%86%E5%88%97%E3%81%A8%E3%81%AF%E3%80%80%E8%80%83%E3%81%88%E6%96%B9%E3%81%A8%E8%A7%A3%E6%B3%95/>


CC BY-SA 4.0
2020-11-20T13:54:29.213
72101
2020-11-20T14:01:56.807
2020-11-20T14:01:56.807
30800
30800
72100
answer


こちらの記事の方が比較の手順を箇条書き的に説明していて分かりやすいと思われます。

[Pythonで文字列を比較（完全一致、部分一致、大小関係など）](https://note.nkmk.me/python-str-compare/)  
[比較演算子の使い方](https://www.javadrive.jp/python/if/index4.html)

抜粋すると以下になります。

  * 1文字目から1文字毎に比較される(違いが出た時点で結果になる)
  * 比較する値はUnicodeのコードポイントの値が使われる
  * アルファベットは大文字のほうが小文字よりもコードポイントが小さい
  * ひらがなのほうがカタカナよりもコードポイントが小さい
  * アルファベットやひらがなカタカナはまとまって順番通りに近いがその他はバラバラ
  * そのため人間のイメージどおりの大小関係になるとは限らない
  * タプルやリストは文字列の考え方と同様に各要素毎に順番に比較が行われる(最初の要素で違いがあればそれが結果になる)

* * *

`'Matplotlib' > 'NumPy' > 'pandas' > 'scikit-
learn'`がFalseになるのは、1文字目の比較で文字のコードポイントの大小が不等号と逆だからですね。  
複数の同時比較は and 条件になるようです。すべて`<`でないとTrueにはなりませんでした。

`('bb', 'c') > ('bcd',
'a')`がFalseになるのは、`'bb'`と`'bcd'`を比較して、2文字目で`'bcd'`の方が大きいとなるからですね


CC BY-SA 4.0
2020-11-20T14:34:57.723
72103
2020-11-20T14:34:57.723
26370
72100
answer


Python3 の場合、文字列(`str`)型インスタンス同士の比較は Unicode code point の比較になります。

[The Python Language Reference: 6.10.1. Value
comparisons](https://docs.python.org/3/reference/expressions.html#value-
comparisons)

> Strings (instances of str) compare lexicographically using the numerical
> Unicode code points (the result of the built-in function
> [ord()](https://docs.python.org/3/library/functions.html#ord) of their
> characters.
[code]

    >>> help(ord)
    Help on built-in function ord in module builtins:
    
    ord(c, /)
        Return the Unicode code point for a one-character string.
    
    >>> from pprint import pprint
    >>> pprint([list(map(ord, word)) for word in ('Matplotlib', 'NumPy', 'pandas', 'scikit-learn')])
    [[77, 97, 116, 112, 108, 111, 116, 108, 105, 98],
     [78, 117, 109, 80, 121],
     [112, 97, 110, 100, 97, 115],
     [115, 99, 105, 107, 105, 116, 45, 108, 101, 97, 114, 110]]
    
    ## 77('M') < 78('N') < 112('p') < 115('s')
    
    >>> 'Matplotlib' < 'NumPy' < 'pandas' < 'scikit-learn'
    True
    
[/code]

`tuple` 同士の比較に関しては、先に挙げたリファレンスの同じ項(`6.10.1. Value comparisons`)に説明があります。

[The Python Language Reference: 6.10.1. Value
comparisons](https://docs.python.org/3/reference/expressions.html#value-
comparisons)

> Sequences (instances of tuple, list, or range) can be compared only within
> each of their types, with the restriction that ranges do not support order
> comparison. Equality comparison across these types results in inequality,
> and ordering comparison across these types raises TypeError.  
>  Sequences compare lexicographically **using comparison of corresponding
> elements**. The built-in containers typically assume identical objects are
> equal to themselves. That lets them bypass equality tests for identical
> objects to improve performance and to maintain their internal invariants.


CC BY-SA 4.0
2020-11-20T14:43:10.013
72104
2020-11-20T14:43:10.013
72100
answer