[python] 키로 정렬 된 파이썬 dict ()를 읽기 쉽게 출력

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}

그러나 항상 파이썬 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에서는 두 번째 sorted ()가 누락되었으므로 (당시 존재하지 않았 음) 한 줄에 인쇄 된 개체가 정렬되지 않습니다.

따라서 대답은 python2.5를 사용하는 것으로 보이지만 질문에서 출력을 설명하지는 못합니다.

Python3 업데이트

정렬 된 키로 예쁜 인쇄 (람다 x : x [0]) :

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

정렬 된 으로 예쁜 인쇄 (람다 x : x [1]) :

for key, value in sorted(dict_example.items(), key=lambda x: x[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
}

또는 파이썬 3 :

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


답변

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


답변

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


답변

나는 당신이 가진 것과 같은 문제가있었습니다. 다음과 같이 사전에 전달되는 정렬 된 함수와 함께 for 루프를 사용했습니다.

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


답변

이 딕셔너리를 약간 변형하여 (딕셔너리가 내부적으로 정렬되지 않기 때문에) 예를 들어

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