Читабельно распечатать 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}

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

7 66

7 ответов:

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

Python3 Update

довольно печати, отсортированный ключи (lambda x: x[0]):

for key, value in sorted(dict_example.items(), key=lambda x: x[0]): 
    print("{} : {}".format(key, value))

довольно печати, отсортированный значения (lambda x: x[1]):

for key, value in sorted(dict_example.items(), key=lambda x: x[1]): 
    print("{} : {}".format(key, value))

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

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

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

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

Ниже приведен пример красивой печати отсортированного содержимого значений словаря Python.

for key, value in sorted(dict_example.items(), key=lambda d_values: d_values[1]): 
    print("{} : {}".format(key, value))

другой вариант :

>>> mydict = {'a':1, 'b':2, 'c':3}
>>> import json

затем с python2 :

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

или с python 3:

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

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

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

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

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