Подтвердить что ты не робот

Считываем распечатку 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}

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

4b9b3361

Ответ 1

На самом деле 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, хотя это не совсем объясняет ваш вывод в вопросе.

Ответ 2

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

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

Ответ 3

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

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)

Ответ 4

Простой способ распечатать отсортированное содержимое словаря в 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)]

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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