2012-04-19 2 views
2

У меня есть частично отсортированный кортеж в Python 2.x.Python 2.x отсортированный 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 (отсортированную (..))» в течение длительного времени. Я подошел к нему, когда я ответил http://stackoverflow.com/questions/10227074/python-max-функция. Да, это было более неожиданно, чем вопрос. – hynekcer

ответ

11

Это терпит неудачу, потому что алгоритм сортировки зависит от общего упорядочения элементов, что предполагает переходные <.

Упорядочения юникода строк, кортежи, и строки не является транзитивным:

>>> 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

Смежные вопросы