개발/Python

[파이썬] 딕셔너리에서 keys()와 values()는 항상 순서가 같을까?

MinorMan 2023. 1. 22. 03:12
반응형

<질문>

다음에 의해 반환된 목록처럼 보입니다.keys()그리고values()사전의 메서드는 항상 1:1 매핑입니다(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

호출 사이에 사전을 변경하지 않으면keys()그리고 전화values(), 위의 for-loop가 항상 True를 출력한다고 가정하는 것이 잘못된 것입니까? 이를 확인하는 문서를 찾을 수 없습니다.


<답변1>

이것을 찾았습니다:

items(), keys(), values(), iteritems(), iterkeys() 및 itervalues()가 사전에 개입하지 않고 호출되면 목록이 직접 대응됩니다.

2.x documentation그리고3.x documentation.


<답변2>

예, 관찰한 것은 실제로 보장된 속성입니다.keys(),values()그리고items()사전이 변경되지 않은 경우 일치하는 순서로 목록을 반환합니다.iterkeys()&c도 해당 목록과 동일한 순서로 반복됩니다.


<답변3>

네 그렇습니다guaranteed in python 2.x:

키, 값 및 항목 보기가 사전에 대한 중간 수정 없이 반복되는 경우 항목 순서가 직접 일치합니다.


<답변4>

예. CPython 3.6부터 사전return items in the order you inserted them.

이것이 구현 세부 사항이라고 말하는 부분을 무시하십시오. 이 동작은 CPython 3.6에서 보장되며required다른 모든 Python 구현의 경우starting with Python 3.7.


<답변5>

문서에 대한 좋은 참조. 다음은 문서/구현에 관계없이 주문을 보장할 수 있는 방법입니다.

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

<답변6>

에 따르면http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects, dict의 keys(), values() 및 items() 메서드는 순서가 일치하는 해당 반복자를 반환합니다. 그러나 동일한 내용에 대한 Python 2.x의 공식 문서에 대한 참조를 찾을 수 없습니다.

내가 말할 수 있는 한 대답은 '예'이지만 파이썬 3.0+에서만 가능합니다.


<답변7>

그만한 가치가 있기 때문에 내가 작성한 일부 대량 사용 프로덕션 코드는 이 가정을 기반으로 하며 문제가 없었습니다. 나는 그것이 사실이 아니라는 것을 압니다 :-)

위험을 감수하고 싶지 않다면 가능한 경우 iteritems()를 사용합니다.

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

<답변8>

나는 파이썬 3.6+에서 사용자의 영향을 받지 않으면 동일하게 유지되어야 한다는 다른 사람들의 의견에 동의합니다.

며칠 전 내 코드의 예:

ips = { '001' : '199.250.178.14', '002' : '199.18.2.89', '003' : '109.251.63.21' }
def run(self):
    for x, y in self.ips.items():
                try:
                    subprocess.check_call(
                    ['ping', '-n', '1', y],
                    stdout=DEVNULL,  # suppress output
                    stderr=DEVNULL
                    )
                except subprocess.CalledProcessError:
                    nextServer = ('HUB ' + x + ' is OFFLINE   ' + " IP:   " + y)

출력은 내가 입력한 것과 항상 동일한 순서입니다. 즉, 오프라인 서버만 순서대로 표시됩니다.

그것을 지우는 희망


<답변9>

다른 사전을 사용하는 경우에도 내보낸 값의 순서가 동일한지 확인하고 싶었기 때문에 이러한 답변에 만족하지 않았습니다.

여기서 키 순서를 미리 지정하면 반환된 값은 사전이 변경되거나 다른 사전을 사용하더라도 항상 동일한 순서를 갖습니다.

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
반응형