2017-10-27 1 views
0

나는 파이썬에서 dict을 만들었고 최대 값을 찾고 싶다. 나는 key = 익명 함수로 max를 실험했다. 확실히 틀린 방법을 사용했지만, 어떻게 든 코드가 돌아가고 키의 출력으로 끝나기 때문에 전혀 이해가되지 않습니다. 누군가가 제게 왜 작동하는지 설명해 주시겠습니까? 고맙습니다. 당신이 max에 사전을 전달하면파이썬에서 key와 lambda를 사용하여 max를 찾는다.

Q['state1']={'zone':20,'left':50,'right':89,'forward':34} 
qmax=max(Q['state1'],key=lambda x: x[1]) %this returns 'forward' 
qmax=max(Q['state1'],key=lambda x: x[0]) %this returns 'zone' 

답변

2

, 그것은 사전 반복 할 키 (여기 문자열의 목록입니다), 당신은 비교기 기능을 지정한 이후, 비교 지금 x[1] 이루어집니다 (첫 번째 줄에서) 각 키의 두 번째 문자가 발생하고 두 번째 줄의 x[0]은 각 키의 첫 번째 문자가됩니다. 사전을 더 주문이 없기 때문에,이 목록은 어떤 순서로 반환 될 수 있음을

['forward', 'zone', 'right', 'left'] 

참고 :

그래서, 예를 들어, 당신은 키의 목록을 가지고있다. 이제 최대를 선택하는 기준은 2 캐릭터입니다, 그래서 당신은에 따라 선택할 :

['f o rward', 'z o ne', 'r i ght', 'l e ft']

그리고 그냥 그렇게 둘 중 하나가되었을 수도 있지만 당신의 CPython 구현을 위해, forward이 (zone 전에 반환되는 것을 일 키가 사전에서 반환 된 순서에 따라 반환됩니다.

+1

주 요소 삽입 및 삭제 순서. 보안 측정 값 (문자열, 바이트 및 날짜 시간)으로 수행되는 해시 섭동은 동일한 인터프리터에서 순서가 다를 수 있다는 것을 의미합니다. 동일한 방식으로 사전을 작성합니다. 새로운 인터프리터가 시작될 때마다 다른 해쉬 시드 (hash seed)가 생기므로 문자열 키의 순서가 변경됩니다. – ShadowRanger

1

lambda에서 키와 값 쌍을 반복하지 않고 dict 키 또는 값의 정렬 키를 사용하지 않고 키의 특정 문자로 정렬 키를 만들기 위해 (문자열) 키를 반복하여 인덱싱합니다. 경우,

max(Q['state1'].viewitems(), key=lambda x: x[1]) # gets ('right', 89) 
max(Q['state1'].viewitems(), key=lambda x: x[0]) # gets ('zone', 20) 

또는 : 나는 당신이 당신이 (Py2.7 .viewitems() 임시 또는 방지하기 위해) .items()를 호출 싶어하는 경우 dict 키 또는 값을 기반으로 max을 발견하도록 같은데요 당신은 key를 건너, 모든 페어링을해야하고, 당신이에 대해 직접 관심 무엇을 반복하지 않습니다 : 그것은 문자열 키 입력 사전이기 때문에, 그것은 구현이 순서를 정의조차 것을의, 나 :

max(Q['state1'].viewvalues()) # gets 89 
max(Q['state1']) # gets 'zone' 
관련 문제