73052


Pythonで

[code]

    'PHP' < 'Perl' < 'Python'
    
[/code]

という文がTrueになり

[code]

    (1, 2, ('bb', 'a')) > (1, 2, ('bcd', 'b'))
    
[/code]

がFalseになる理由がよくわかりません。  
後者は1,2が同じなのでアルファベットの含まれているタプル同士で比べるというのは想像がつくのですが、  
bb<bcd、a<bなのでFalseということでしょうか？  
詳しい方、教えていただけますと幸いです。


CC BY-SA 4.0
2021-01-03T19:16:30.500
73049
2021-01-04T00:59:46.903
12457
question
python
Pythonにおける真偽判定

[code]

    'PHP' < 'Perl' < 'Python'
    
[/code]

という式は

[code]

    'PHP' < 'Perl' and 'Perl' < 'Python'
    
[/code]

に置き換えられます。  
[6\. 式 (expression) — Python 3.9.1
ドキュメント](https://docs.python.org/ja/3/reference/expressions.html#comparisons)  
両方 `True` ですので結果も `True` となります。

タプルの比較ですが、まず `1`, `2` と順番に比較していきますこの時実は内部では **同じ値はすっ飛ばしています**
。そして次がタプルなのでタプルの中に入ります。またタプルを見ていきます。`bb` > `bcd` は `False`
ではじめてでてきた結果ですね。これがそのまま結果となります。後ろのことは関係ありません。このようにタプルの比較では暗黙のうちに同値比較が行われています。そして「比較」ができる部分に達してはじめて比較を始めるのです。

[code]

    ('bcd', 'a') > ('bcd', 'b') # False
    
[/code]

となることからも仕組みがわかるでしょう。


CC BY-SA 4.0
2021-01-03T20:02:00.613
73050
2021-01-03T20:02:00.613
39645
73049
answer


> bb<bcd、a<bなのでFalseということでしょうか？

`bb<bcd`であるため、Falseになります。`a<b`は無関係のようです。  
順を追って確認してみます。

[code]

    >>> (1, 2, ('bb', 'a')) > (1, 2, ('bcd', 'b'))
    False
    
[/code]

は

[code]

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

に起因するようです。試しに'a'と'b'を入れ替えてみると

[code]

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

こちらもFalseになります。

このことから、式の評価がFalseになるのは`bb<bcd`であるためと思われます。

* * *

<https://docs.python.org/ja/3/reference/expressions.html#comparisons>  
によると

> 順序比較をサポートしているコレクションの順序は、最初の等価でない要素の順序と同じになります

<https://docs.python.org/ja/3/library/stdtypes.html>  
によると

> 同じ型のシーケンスは比較もサポートしています。特に、タプルとリストは対応する要素を比較することで辞書式順序で比較されます。

以上から`(1, 2, ('bb', 'a')) > (1, 2, ('bcd', 'b'))`を比較すると  
最初の等価でない'bb'と'bcd'を辞書順で比較した結果がFalseとなるため、式全体がFlseになります。


CC BY-SA 4.0
2021-01-04T00:59:46.903
73052
2021-01-04T00:59:46.903
35558
73049
answer