<질문>
다음에 의해 반환된 목록처럼 보입니다.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]
'개발 > Python' 카테고리의 다른 글
[파이썬] 리스트에서 교차점을 찾는 방법? (0) | 2023.01.22 |
---|---|
[파이썬] os.path.join()이 작동하지 않는 이유? (0) | 2023.01.22 |
[파이썬] 파일을 읽으면 파일 핸들이 계속 열려 있어야 할까? (0) | 2023.01.22 |
[파이썬] 파일이 비어 있는지 확인하는 방법 (0) | 2023.01.21 |