파이썬 사전 : keys ()와 values ​​()는 항상 같은 순서입니까?


312

사전에 의해 리턴 된 목록 keys()values()사전의 메소드는 항상 일대일 맵핑입니다 (사전이 2 개의 메소드 호출간에 변경되지 않는다고 가정).

예를 들면 다음과 같습니다.

>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
    print d[k[i]] == v[i]

True
True
True

calling keys()와 calling 사이에서 사전을 변경하지 않으면 values()위의 for-loop가 항상 True로 인쇄된다고 가정하는 것이 잘못입니까? 이를 확인하는 문서를 찾을 수 없습니다.


1
CPython 3.7 이상 (아마도)에서는 사전 일치 삽입 순서의 반복 순서에 의존 할 수 있습니다. mail.python.org/pipermail/python-dev/2017-December/151283.html
BallpointBen

@BallpointBen CPython 3.6 이상 및 Python 3.7부터 시작하는 기타 모든 Python 구현
Boris

답변:


353

이것을 찾았습니다 :

경우 items(), keys(), values(), iteritems(), iterkeys(),와 itervalues()사전에 전혀 개입의 수정이라고, 목록은 직접 대응됩니다.

2.X 문서3.X 문서 .


5
분명히 3.x 문서의 진술은 더 명확하다 : "항목의 순서는 직접 일치 할 것이다"
Shaohua Li

4
이 텍스트는 3.7 설명서에 없습니다. 3.7에서 "Dict가 삽입 순서를 유지하기 때문"이라고 가정 할 수 있습니다. mail.python.org/pipermail/python-dev/2017-December/151283.html
EliadL

80

그렇습니다. 관심 사항이 변경되지 않으면 keys (), values ​​() 및 items () 반환 목록이 합당한 순서로 실제로 보장 된 속성입니다. iterkeys () & c도 해당 목록과 동일한 순서로 반복됩니다.


1
그러나 목록 변경 되는 경우 Pandas dataframe는 항목을 업데이트하거나 삭제할 수있는 대안을 제공하며, dict-like 구조의 항목 순서 및 색인 위치는 그대로 유지됩니다.
Ville



6

문서에 대한 좋은 참고 자료. 설명서 / 구현에 관계없이 주문을 보장하는 방법은 다음과 같습니다.

k, v = zip(*d.iteritems())

1
python3.x에서 dict.items ()를 사용하십시오
Good Will


4

가치가있는 것으로, 내가 작성한 일부 중고 프로덕션 코드는이 가정을 기반으로하며 문제가 없었습니다. 나는 그것이 사실이 아니라는 것을 안다 :-)

위험을 감수하고 싶지 않다면 iteritems ()를 사용하십시오.

for key, value in myDictionary.iteritems():
    print key, value

-2

다른 dicts를 사용할 때도 내 보낸 값의 순서가 동일하게 유지되기를 원했기 때문에 이러한 답변에 만족하지 못했습니다.

여기에서 키 순서를 미리 지정하고, dict가 변경 되더라도 다른 값을 사용하더라도 반환 된 값은 항상 동일한 순서를 갖습니다.

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.