[python] 목록에서 max () / min ()을 사용하여 반환 된 최대 또는 최소 항목의 인덱스 가져 오기

minimax 알고리즘의 목록에서 Python maxmin함수를 사용 하고 있으며 max()또는에서 반환하는 값의 인덱스가 필요합니다 min(). 다시 말해, 어떤 움직임이 최대 (첫 번째 플레이어 차례) 또는 최소 (두 번째 플레이어) 값을 생성했는지 알아야합니다.

for i in range(9):
    newBoard = currentBoard.newBoardWithMove([i / 3, i % 3], player)

    if newBoard:
        temp = minMax(newBoard, depth + 1, not isMinLevel)  
        values.append(temp)

if isMinLevel:
    return min(values)
else:
    return max(values)

값뿐만 아니라 최소 또는 최대 값의 실제 색인을 반환 할 수 있어야합니다.



답변

isMinLevel 인 경우 :
    반환 값. 인덱스 (분 (값))
그밖에:
    반환 값 .index (max (values))


답변

list values = [3,6,1,5]가 있고 가장 작은 요소의 인덱스가 필요하다고 가정하십시오 ( index_min = 2이 경우).

itemgetter()다른 답변에 제시된 해결책을 피하고 대신 사용하십시오.

index_min = min(range(len(values)), key=values.__getitem__)

import operator를 사용할 필요 도없고 사용할 필요가 없으며를 사용 enumerate하는 솔루션보다 항상 빠릅니다 (아래 벤치 마크) itemgetter().

numpy 배열을 다루거나 numpy종속성으로 감당할 수있는 경우

import numpy as np
index_min = np.argmin(values)

다음과 같은 경우 순수 Python 목록에 적용하더라도 첫 번째 솔루션보다 빠릅니다.

  • 그것은 몇 가지 요소보다 큽니다 (내 기계의 약 2 ** 4 요소)
  • 순수한 목록에서 numpy배열로 메모리 사본을 감당할 수 있습니다

이 벤치 마크가 지적한대로 :
여기에 이미지 설명을 입력하십시오

위의 두 가지 솔루션 (파란색 : 순수한 파이썬, 첫 번째 솔루션) (빨간색, numpy 솔루션) 및 표준 솔루션 itemgetter()(검은 색, 참조 솔루션)에 대해 python 2.7을 사용하여 컴퓨터에서 벤치 마크를 실행했습니다 . python 3.5와 동일한 벤치 마크는 방법이 위에서 제시 한 python 2.7 사례와 정확히 동일하다는 것을 보여주었습니다.


답변

목록의 항목을 열거하지만 목록의 원래 값에 대해 최소 / 최대를 수행하면 최소 / 최대 색인과 값을 동시에 찾을 수 있습니다. 이렇게 :

import operator
min_index, min_value = min(enumerate(values), key=operator.itemgetter(1))
max_index, max_value = max(enumerate(values), key=operator.itemgetter(1))

이런 식으로 목록은 최소 (또는 최대) 동안 한 번만 순회됩니다.


답변

숫자 목록 (최대한 경우)에서 max의 색인을 찾으려면 numpy를 사용하는 것이 좋습니다.

import numpy as np
ind = np.argmax(mylist)


답변

아마도 더 간단한 해결책은 값의 배열을 값의 배열, 인덱스 쌍으로 바꾸고 그 최대 / 최소값을 취하는 것입니다. 이것은 최대 / 최소를 갖는 최대 / 최소 인덱스를 제공합니다 (즉, 첫 번째 요소를 먼저 비교 한 다음 첫 번째 요소가 동일한 경우 두 번째 요소를 비교하여 쌍을 비교합니다). min / max는 제너레이터를 입력으로 허용하기 때문에 실제로 배열을 만들 필요는 없습니다.

values = [3,4,5]
(m,i) = max((v,i) for i,v in enumerate(values))
print (m,i) #(5, 2)


답변

list=[1.1412, 4.3453, 5.8709, 0.1314]
list.index(min(list))

최소의 첫 번째 색인을 제공합니다.


답변

가장 좋은 방법은 목록을 a로 변환 numpy array하고이 기능을 사용하는 것입니다.

a = np.array(list)
idx = np.argmax(a)