Вопрос: dicts не заказываются в python 3?


Почему dicts упорядочивается в python2, но не в python3? Я не могу найти его нигде в документации.

Python 3.3.4 (default, Feb 11 2014, 16:14:21)
>>> sorted([{'a':'a'},{'b':'b'}])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: dict() < dict()

против

Python 2.7.6 (default, Feb 26 2014, 12:01:28)
>>> sorted([{'a':'a'},{'b':'b'}])
[{'a': 'a'}, {'b': 'b'}

5


источник


Ответы:


Python 2 использует недокументированный заказ , реализованный как .__cmp__() специальный способ.

Заказ имеет смысл только в ограниченном наборе прецедентов и существует только потому, что Python 2 пытается сделать все  упорядочиваема.

Python 3 радикально очистила историю заказа Python ; .__cmp__() и только типы, которые на самом деле имеют естественный порядок (например, числа и строки), теперь поддерживают упорядочение. Для всего остального вам нужно явно определить порядок.

Словари не имеют естественного порядка. Если вам нужно заказать словари, вам необходимо определить явный порядок, который имеет смысл для вашего прецедента. Если это означает сравнение только ключей, сделайте это (например, используйте key=sorted), и т.д.


8



Вам нужно будет sort с key ( документация ). Только вы знаете, какой ключ вы хотите, но вот один пример:

>>> dicts = [{'a':'a'},{'b':'b'}]
>>> sorted(dicts, key=lambda x:sorted(x.keys()))
[{'a': 'a'}, {'b': 'b'}]

Это сортировка по ключам, где сначала вводится ключ с наименьшей клавишей


Редактировать:  как отметил Мартин Пайтерс, этот ответ  описывает, как именно это делает Python 2. Но вы должны разбираться в том, что имеет смысл ваша ситуация , что может принципиально отличаться от того, как это делает Python 2.


8