사전의 키 순서


101

암호:

d = {'a': 0, 'b': 1, 'c': 2}
l = d.keys()

print l

이것은 인쇄합니다 ['a', 'c', 'b']. 방법이 lkeys() 내의 키워드 순서를 결정하는 방법을 잘 모르겠습니다 . 그러나 "적절한"순서로 키워드를 검색 할 수 있기를 바랍니다. 물론 적절한 순서는 목록을 만들 것 입니다.['a', 'b', 'c']


3
Python 사전이 대부분의 경우 실제로 해시 테이블입니다. 무엇보다도 키의 ​​순서가 보장되지 않거나 지정되지 않았 음을 의미합니다. 특히 키가 추가되는 순서를 기억하지 못합니다.
cHao 2011

3
@cHao : 이것은 본질적으로 사전의 요소를 반복하면 프로그램이 비 결정적이라는 것을 의미합니까?
HelloGoodbye 2014 년

4
@HelloGoodbye : 나는 그렇게 멀리 가지 않을 것입니다; 거기에는 여전히 매우 예측 가능한 행동이 있습니다. 각 전체 반복은 각 키 / 값 쌍 중 정확히 하나를 봅니다. 그리고 대부분의 언어에서는 매번 같은 순서로 볼 수도 있습니다. 문서가 특정 주문을 보장하지 않는 한, 원하는 주문이라고 믿어서는 안됩니다. (Perl과 같은 일부 언어는 보안상의 이유로 실제로 순서를 약간 무작위로 지정하지만, 지정되지 않은 동작에 의존하는 습관에서 벗어나게하는 것이 실제로는 그렇게 생각 하지 않습니다. :) 저는 Python이 꽤 괜찮다고 생각 하지 않습니다. 악하지만, 어 ...)
차오

1
dict가 수정되지 않은 경우 순서는 동일합니다. 매뉴얼에서 : "item (), keys (), values ​​(), iteritems (), iterkeys () 및 itervalues ​​()가 사전에 개입하지 않고 호출되면 목록이 직접 대응됩니다.이를 통해 생성이 가능합니다. zip ()을 사용하는 (값, 키) 쌍 : 쌍 = zip (d.values ​​(), d.keys ()). "
steveayre 2015

2
@sfranky steveayre가 의미하는 바는 언급 된 다른 방법을 사용하여 얻은 순서가 요소가 작성된 순서와 동일하지 않다는 것입니다.
bli

답변:


78

OrderedDict (Python 2.7 필요) 이상을 사용할 수 있습니다 .

또한, 주 OrderedDict({'a': 1, 'b':2, 'c':3})때문에 작동하지 않습니다 dict당신이 만들 {...}이미 요소의 순서를 잊어있다. 대신 OrderedDict([('a', 1), ('b', 2), ('c', 3)]).

문서에서 언급했듯이 Python 2.7보다 낮은 버전의 경우이 레시피를 사용할 수 있습니다 .


18
OrderedDict의 순서는 삽입 순서입니다. 그런 식으로 삽입하면 키가 알파벳순으로 만 나옵니다.
Hugh Bothwell 2011

그가 간단한 예로서 보여준 것입니다. 실제 사용 계획과 관련이있을 수도 있고 없을 수도 있습니다. 이전에 OrderedDict가 임의의 삽입을 정렬 된 순서로 반환 할 것으로 예상하는 사람들을 만났기 때문에이 점을 지적해야한다고 느꼈습니다.
Hugh Bothwell 2011

119

Python 3.7 이상

Python 3.7.0 에서 dict객체 의 삽입 순서 보존 특성은 Python 언어 사양의 공식 부분 으로 선언되었습니다 . 따라서 그것에 의존 할 수 있습니다.

Python 3.6 (CPython)

Python 3.6부터 Python의 CPython 구현을 위해 사전 은 기본적으로 삽입 순서유지 합니다. 이것은 구현 세부 사항으로 간주됩니다. collections.OrderedDict다른 Python 구현에서 보장되는 삽입 순서를 원하는 경우 계속 사용해야 합니다.

Python> = 2.7 및 <3.6

삽입 된 항목의 순서를 기억 하는 collections.OrderedDict클래스가 필요할 때 사용하십시오 dict.


48
>>> print sorted(d.keys())
['a', 'b', 'c']

전달 된 iterable을 정렬 하는 sorted 함수를 사용하십시오 .

.keys()메서드는 임의의 순서로 키를 반환합니다.


12
원래 주문을 원하고 정렬되지 않은 경우 작동하지 않습니다.
Simon

12

사용하고 싶을 때 목록을 정렬하면됩니다.

l = sorted(d.keys())


1

사전이 해시 맵이므로 순서는 중요하지 않습니다. 푸시되는 순서에 따라 다릅니다.

s = 'abbc'
a = 'cbab'

def load_dict(s):
    dict_tmp = {}
    for ch in s:
        if ch in dict_tmp.keys():
            dict_tmp[ch]+=1
        else:
            dict_tmp[ch] = 1
    return dict_tmp

dict_a = load_dict(a)
dict_s = load_dict(s)
print('for string %s, the keys are %s'%(s, dict_s.keys()))
print('for string %s, the keys are %s'%(a, dict_a.keys()))

출력 :
문자열 abbc의 경우 키는 문자열 cbab의 경우 dict_keys ([ 'a', 'b', 'c'])
이고 키는 dict_keys ([ 'c', 'b', 'a'])입니다.


1
사전 파이썬에 삽입 버전 3.6 이상에서만 정렬 이 확인
Crivella
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.