2012-04-19 6 views
2

Python 2.xで部分的にソートされたタプルがあります。Python 2.x sorted puzzlement

なぜPythonはそれを並べ替えるのではなく逆にするのですか?

>>> data = (u'a', (1,), 'b ', u'b', (2,), 'c ', u'c', (3,), 'd ', u'd', (4,), 'e') 
>>> sorted(data) == list(reversed(data)) 
True 

は、私は、Python 3

+0

これは実際の質問ですか、あるいはPython 2.xの奇妙なことを編集する方法ですか?あなたはこれが異なるタイプを比較するのは馬鹿だからです。 Python 3.xでは、試してみると例外が発生します。このような定義された振る舞いの境界を押すと、いつでも奇妙な奇妙なものが見つかるはずです。私はあなたがそれを知っていると思います。「私はPython 3を楽しみにしています。 – steveha

+0

私は長い時間ユニークな "groupby(sorted(..))"に頼っているので驚いた。私はそれに私がhttp://stackoverflow.com/questions/10227074/python-max-functionに答えたときにはい、それは質問よりも驚きでした。 – hynekcer

答えて

11

ソートアルゴリズムが推移<を意味要素の全順序に依存するのでそれが失敗したことを楽しみにしています。

Unicode文字列、タプル、文字列の順序付けは推移ではありません。

>>> a = 'x' 
>>> b = (1,) 
>>> c = u'x' 
>>> a < b 
True 
>>> b < c 
True 
>>> a < c 
False 

つまり、あなたのリストのための有効なソートは存在しません。少なくともデフォルトコンパレータではありません。

+1

Deestan:文のおかげで**ソートは推移的 "<" **に依存します。私にとって最悪ののは、 'a、b、c = 'x'、(1、)、u'x'''を' a hynekcer