minimax 알고리즘의 목록에서 Python max
과 min
함수를 사용 하고 있으며 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)