[python] 키를 기준으로 사전을 정렬하려면 어떻게해야합니까?

에서 갈 수있는 좋은 방법이 있을까요 {2:3, 1:89, 4:5, 3:0}{1:89, 2:3, 3:0, 4:5}?
일부 게시물을 확인했지만 모두 튜플을 반환하는 “정렬 된”연산자를 사용합니다.



답변

표준 파이썬 사전은 순서가 없습니다. (키, 값) 쌍을 정렬하더라도 dict순서를 유지하는 방식으로 저장할 수는 없습니다 .

가장 쉬운 방법은 OrderedDict요소를 삽입 한 순서를 기억하는를 사용 하는 것입니다.

In [1]: import collections

In [2]: d = {2:3, 1:89, 4:5, 3:0}

In [3]: od = collections.OrderedDict(sorted(d.items()))

In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])

방법 od이 인쇄되는 것을 신경 쓰지 마십시오 . 예상대로 작동합니다.

In [11]: od[1]
Out[11]: 89

In [12]: od[3]
Out[12]: 0

In [13]: for k, v in od.iteritems(): print k, v
   ....:
1 89
2 3
3 0
4 5

파이썬 3

Python 3 사용자의 경우 .items()대신 다음 을 사용해야합니다 .iteritems().

In [13]: for k, v in od.items(): print(k, v)
   ....:
1 89
2 3
3 0
4 5


답변

사전 자체에는 주문한 항목이 없습니다. 어떤 순서로 인쇄하려는 경우 다음과 같은 예가 있습니다.

Python 2.4 이상에서 :

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict):
    print "%s: %s" % (key, mydict[key])

제공합니다 :

alan: 2
bob: 1
carl: 40
danny: 3

(2.4 이하의 파이썬 🙂

keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])

출처 : http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/


답변

에서 파이썬 collections라이브러리 문서 :

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])


답변

CPython / PyPy 3.6 및 Python 3.7 이상의 경우 다음을 사용하여 쉽게 수행 할 수 있습니다.

>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}


답변

키를 정렬 된 순서로 자동 유지 관리하는 사전 구현을 제공하는 많은 Python 모듈이 있습니다. 순수 Python 및 빠른 C 구현 인 sortedcontainers 모듈을 고려하십시오 . 서로 벤치 마크 된 다른 인기있는 옵션과 의 성능 비교 도 있습니다.

반복하면서 키 / 값 쌍을 지속적으로 추가하고 제거해야하는 경우 순서가 지정된 dict를 사용하는 것은 부적절한 솔루션입니다.

>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]

SortedDict 유형은 내장 dict 유형으로는 불가능한 색인 된 위치 검색 및 삭제도 지원합니다.

>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])


답변

간단히:

d = {2:3, 1:89, 4:5, 3:0}
sd = sorted(d.items())

for k,v in sd:
    print k, v

산출:

1 89
2 3
3 0
4 5


답변

다른 사람들이 언급했듯이 사전은 본질적으로 순서가 없습니다. 그러나 문제가 순서대로 사전을 표시하는__str__ 경우 사전 서브 클래스 의 메소드를 대체 하고 내장 클래스 대신이 사전 클래스를 사용할 수 있습니다 dict. 예 :

class SortedDisplayDict(dict):
   def __str__(self):
       return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"


>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}

이것은 키가 저장되는 방식, 키를 반복 할 때 키가 반환되는 순서 print, 파이썬 콘솔에서 또는 파이썬 콘솔에서 표시되는 방식에 대해서는 아무것도 변경하지 않습니다 .