Сортировка pprint диктует, но не устанавливает?
Я знаю, что дикты и наборы не упорядочены, поэтому одинаковые наборы или дикты могут печататься по-разному (все тесты с Python 3.6.1):
>>> for obj in {0, 8}, {8, 0}, {0:0, 8:8}, {8:8, 0:0}:
print(obj)
{0, 8}
{8, 0}
{0: 0, 8: 8}
{8: 8, 0: 0}
И я только что понял, что pprint
("Pretty-print") сортирует диктовки, но не наборы:
>>> for obj in {0, 8}, {8, 0}, {0:0, 8:8}, {8:8, 0:0}:
pprint.pprint(obj)
{0, 8}
{8, 0}
{0: 0, 8: 8}
{0: 0, 8: 8}
В документации также говорится, что "Словари сортируются по ключу до вычисления дисплея". Но почему он также не сортирует наборы? Мне не кажется симпатичным. И есть ли способ сделать это сортировать наборы? Также внутри вложенных структур, так как это основная цель pprint
,
1 ответ
Эта проблема была поднята в выпуске 27495, и это скорее ошибка, чем просто выбор дизайна, но, видимо, она еще не решена.
Вот еще один пример из этой проблемы, который, возможно, более наглядно иллюстрирует поведение, которое вы идентифицируете в Python 3:
>>> import string, pprint >>> pprint.pprint(set(string.digits)) {'7', '1', '9', '8', '3', '0', '2', '5', '6', '4'}
То же самое относится и к frozenset()
тоже, но учтите, что многострочныйpprint
выходныеданные сортируются в Python 3, например:
>>> pprint.pprint(set(string.digits), width=1) {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
Однако в Python 2 выходные данные из того же исходного кода сортируются:
>>> pprint.pprint(set(string.digits)) set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
Я думаю, что это несоответствие между Python 3 и Python 2, а также между однострочным многострочным поведением, что делает это ошибкой.
Заdict
Подобный пример s иллюстрирует, как вы заметили, вывод сортируется в Python 3 или 2, как и должно быть:
>>> pprint.pprint({i:None for i in set(string.digits)})
{'0': None,
'1': None,
'2': None,
'3': None,
'4': None,
'5': None,
'6': None,
'7': None,
'8': None,
'9': None}
Тем не менее, для Python 3.6 было бы удивительно, что pprint
видыdict
с тех пор как они заказаны сейчас. Тем не менее, так как это только детали реализации (на данный момент), я думаю, что нет никаких обязательств для pprint
поддерживать порядок вставки (пока), и это нарушит pprint
Собственная согласованность версий Python всегда сортировки dict
s.