Считываем распечатку python dict (), отсортированную по ключу

Я хотел бы напечатать словарь python в файл с использованием PrettyPrinter (для удобства чтения), но словарь должен быть отсортирован по ключу в выходном файле для дальнейшего улучшения удобочитаемости. Так:

mydict = {'a':1, 'b':2, 'c':3} pprint(mydict) 

в настоящее время печатает

 {'b':2, 'c':3, 'a':1} 

Я хотел бы PrettyPrint словаря, но распечатал его, отсортированный по ключу, например.

 {'a':1, 'b':2, 'c':3} 

Каков наилучший способ сделать это?

Фактически pprint, похоже, сортирует ключи для вас под python2.5

 >>> from pprint import pprint >>> mydict = {'a':1, 'b':2, 'c':3} >>> pprint(mydict) {'a': 1, 'b': 2, 'c': 3} >>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5} >>> pprint(mydict) {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} >>> d = dict(zip("kjihgfedcba",range(11))) >>> pprint(d) {'a': 10, 'b': 9, 'c': 8, 'd': 7, 'e': 6, 'f': 5, 'g': 4, 'h': 3, 'i': 2, 'j': 1, 'k': 0} 

Но не всегда под python 2.4

 >>> from pprint import pprint >>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5} >>> pprint(mydict) {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4} >>> d = dict(zip("kjihgfedcba",range(11))) >>> pprint(d) {'a': 10, 'b': 9, 'c': 8, 'd': 7, 'e': 6, 'f': 5, 'g': 4, 'h': 3, 'i': 2, 'j': 1, 'k': 0} >>> 

Читая исходный код pprint.py (2.5), он сортирует словарь, используя

 items = object.items() items.sort() 

для многострочной или для одной линии

 for k, v in sorted(object.items()): 

прежде чем он попытается напечатать что-либо, поэтому, если ваш словарь правильно сортируется, тогда он должен правильно напечатать. В 2.4 отсутствует вторая сортировка () (не существует), поэтому объекты, напечатанные в одной строке, не будут отсортированы.

Поэтому ответ, похоже, используется python2.5, хотя это не совсем объясняет ваш вывод в вопросе.

Модуль pprint фактически уже сортирует словари по ключу. В версиях, предшествующих Python 2.5, сортировка запускалась только в словарях, чьи довольно печатные представления охватывали несколько строк, но в версиях 2.5.X и 2.6.X все словари отсортированы.

Как правило, если вы пишете структуры данных в файл и хотите, чтобы они были удобными для чтения и записи, вам может потребоваться использовать альтернативный формат, такой как YAML или JSON. Если ваши пользователи сами программисты, если они поддерживают конфигурацию или состояние приложения, сбрасываемые через pprint и загруженные через eval могут быть разочаровывающей и подверженной ошибкам задачей.

Я написал следующую функцию для печати dicts, lists и tuples в более читаемом формате:

 def printplus(obj): """ Pretty-prints the object passed in. """ # Dict if isinstance(obj, dict): for k, v in sorted(obj.items()): print u'{0}: {1}'.format(k, v) # List or tuple elif isinstance(obj, list) or isinstance(obj, tuple): for x in obj: print x # Other else: print obj 

Пример использования в iPython:

 >>> dict_example = {'c': 1, 'b': 2, 'a': 3} >>> printplus(dict_example) a: 3 b: 2 c: 1 >>> tuple_example = ((1, 2), (3, 4), (5, 6), (7, 8)) >>> printplus(tuple_example) (1, 2) (3, 4) (5, 6) (7, 8) 

Простой способ распечатать отсортированное содержимое словаря в Python 3:

 >>> dict_example = {'c': 1, 'b': 2, 'a': 3} >>> for key, value in sorted(dict_example.items()): ... print("{} : {}".format(key, value)) ... a : 3 b : 2 c : 1 

Выражение dict_example.items() возвращает кортежи, которые затем могут быть отсортированы по sorted() :

 >>> dict_example.items() dict_items([('c', 1), ('b', 2), ('a', 3)]) >>> sorted(dict_example.items()) [('a', 3), ('b', 2), ('c', 1)] 

Другая альтернатива:

 >>> mydict = {'a':1, 'b':2, 'c':3} >>> import json >>> print json.dumps(mydict, indent=4, sort_keys=True) { "a": 1, "b": 2, "c": 3 } 

Вы можете немного изменить этот dict, чтобы гарантировать, что (так как dicts не сортируются внутренне), например

 pprint([(key, mydict[key]) for key in sorted(mydict.keys())]) 

У меня была такая же проблема. Я использовал цикл for с сортированной функцией, проходящей в словаре следующим образом:

 for item in sorted(mydict): print(item)