목록에서 최대값의 모든 위치를 찾으려면 어떻게 해야 합니까?
리스트가 있습니다.
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
max 요소는 55(위치 9와 12의 2개의 요소)입니다.
최대값이 어느 위치에 있는지 확인해야 합니다.제발 도와주세요.
a.index(max(a))
목록의 가장 큰 값 요소의 첫 번째 인스턴스의 인덱스를 알려드립니다.a.
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
선택한 답변(및 대부분의 답변)에는 적어도2개의 패스스루 목록이 필요합니다.
여기 긴 리스트에는 원패스 솔루션이 있습니다.
편집: @John Machin이 지적한 두 가지 결점에 대처합니다.(2) 나는 각 조건의 발생 추정 확률과 이전 조건의 추론을 바탕으로 테스트를 최적화하려고 시도했다.적절한 초기화 값을 알아내는 것은 조금 어려웠습니다.max_val그리고.max_indices가능한 모든 경우에 효과가 있었습니다.특히 max 값이 리스트의 첫 번째 값일 경우입니다만, 지금은 효과가 있다고 생각합니다.
def maxelements(seq):
''' Return list of position(s) of largest element '''
max_indices = []
if seq:
max_val = seq[0]
for i,val in ((i,val) for i,val in enumerate(seq) if val >= max_val):
if val == max_val:
max_indices.append(i)
else:
max_val = val
max_indices = [i]
return max_indices
다음과 같은 것을 생각해 냈는데, 보시는 바와 같이 동작합니다.max,min기타 기능은 다음과 같습니다.
따라서 다음 예제 목록을 검토하여 목록에서 최대값의 위치를 확인하십시오.a:
>>> a = [3,2,1, 4,5]
제너레이터 사용 enumerate그리고 캐스팅을 하고
>>> list(enumerate(a))
[(0, 3), (1, 2), (2, 1), (3, 4), (4, 5)]
이 시점에서 max의 위치를 추출할 수 있습니다.
>>> max(enumerate(a), key=(lambda x: x[1]))
(4, 5)
위에서 알 수 있듯이, 최대값은 포지션 4이고 그의 값은 5입니다.
보다시피key인수. 적절한 람다를 정의하면 반복 가능한 개체에 대한 최대값을 찾을 수 있습니다.
그것이 기여하기를 바랍니다.
PD: @PaulOyster가 댓글로 언급했듯이.와 함께Python 3.x그min그리고.max새로운 키워드를 허가하다default임금 인상 예외를 피하다ValueError인수가 빈 리스트인 경우. max(enumerate(list), key=(lambda x:x[1]), default = -1)
또한 첫 등장만을 제공하는 솔루션은 다음을 사용하여 달성할 수 있습니다.numpy:
>>> import numpy as np
>>> a_np = np.array(a)
>>> np.argmax(a_np)
9
@martineau가 인용한 @SilentGhost-beating 퍼포먼스를 재현할 수 없습니다.비교한 내용은 다음과 같습니다.
=== maxelements.py ===
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
b = range(10000)
c = range(10000 - 1, -1, -1)
d = b + c
def maxelements_s(seq): # @SilentGhost
''' Return list of position(s) of largest element '''
m = max(seq)
return [i for i, j in enumerate(seq) if j == m]
def maxelements_m(seq): # @martineau
''' Return list of position(s) of largest element '''
max_indices = []
if len(seq):
max_val = seq[0]
for i, val in ((i, val) for i, val in enumerate(seq) if val >= max_val):
if val == max_val:
max_indices.append(i)
else:
max_val = val
max_indices = [i]
return max_indices
def maxelements_j(seq): # @John Machin
''' Return list of position(s) of largest element '''
if not seq: return []
max_val = seq[0] if seq[0] >= seq[-1] else seq[-1]
max_indices = []
for i, val in enumerate(seq):
if val < max_val: continue
if val == max_val:
max_indices.append(i)
else:
max_val = val
max_indices = [i]
return max_indices
Windows XP SP3에서 Python 2.7을 실행하는 오래된 노트북에서 얻은 결과:
>\python27\python -mtimeit -s"import maxelements as me" "me.maxelements_s(me.a)"
100000 loops, best of 3: 6.88 usec per loop
>\python27\python -mtimeit -s"import maxelements as me" "me.maxelements_m(me.a)"
100000 loops, best of 3: 11.1 usec per loop
>\python27\python -mtimeit -s"import maxelements as me" "me.maxelements_j(me.a)"
100000 loops, best of 3: 8.51 usec per loop
>\python27\python -mtimeit -s"import maxelements as me;a100=me.a*100" "me.maxelements_s(a100)"
1000 loops, best of 3: 535 usec per loop
>\python27\python -mtimeit -s"import maxelements as me;a100=me.a*100" "me.maxelements_m(a100)"
1000 loops, best of 3: 558 usec per loop
>\python27\python -mtimeit -s"import maxelements as me;a100=me.a*100" "me.maxelements_j(a100)"
1000 loops, best of 3: 489 usec per loop
numpy 패키지를 사용할 수도 있습니다.
import numpy as np
A = np.array(a)
maximum_indices = np.where(A==max(a))
그러면 최대값을 포함하는 모든 인덱스의 numpy 배열이 반환됩니다.
이 항목을 목록으로 변환하려면 , 다음의 순서에 따릅니다.
maximum_indices_list = maximum_indices.tolist()
a = [32, 37, 28, 30, 37, 25, 27, 24, 35,
55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
import pandas as pd
pd.Series(a).idxmax()
9
저는 보통 그렇게 해요.
>>> max(enumerate([1,2,3,32,1,5,7,9]),key=lambda x: x[1])
>>> (3, 32)
최대 목록 요소의 색인을 찾는 피톤식 방법은 다음과 같습니다.
position = max(enumerate(a), key=lambda x: x[1])[0]
어느쪽이든 합격이다.단, @Silent_Ghost의 솔루션보다 느립니다.또, @nmichaels의 솔루션보다 느립니다.
for i in s m j n; do echo $i; python -mtimeit -s"import maxelements as me" "me.maxelements_${i}(me.a)"; done
s
100000 loops, best of 3: 3.13 usec per loop
m
100000 loops, best of 3: 4.99 usec per loop
j
100000 loops, best of 3: 3.71 usec per loop
n
1000000 loops, best of 3: 1.31 usec per loop
한 줄만:
idx = max(range(len(a)), key = lambda i: a[i])
다음은 최대값과 표시되는 인덱스를 나타냅니다.
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50, 35, 41, 49, 37, 19, 40, 41, 31]
>>> for i, x in enumerate(a):
... d[x].append(i)
...
>>> k = max(d.keys())
>>> print k, d[k]
55 [9, 12]
나중에: @SilentGhost를 만족시키기 위해
>>> from itertools import takewhile
>>> import heapq
>>>
>>> def popper(heap):
... while heap:
... yield heapq.heappop(heap)
...
>>> a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50, 35, 41, 49, 37, 19, 40, 41, 31]
>>> h = [(-x, i) for i, x in enumerate(a)]
>>> heapq.heapify(h)
>>>
>>> largest = heapq.heappop(h)
>>> indexes = [largest[1]] + [x[1] for x in takewhile(lambda large: large[0] == largest[0], popper(h))]
>>> print -largest[0], indexes
55 [9, 12]
목록 이해는 있지만 열거는 하지 않은 유사한 아이디어
m = max(a)
[i for i in range(len(a)) if a[i] == m]
큰 의 n 내의 data팬더를 사용할 수 있습니다.
pd.Series(data).sort_values(ascending=False).index[0:n]
당신은 그것을 다양한 방법으로 할 수 있습니다.
예전 방식대로라면
maxIndexList = list() #this list will store indices of maximum values
maximumValue = max(a) #get maximum value of the list
length = len(a) #calculate length of the array
for i in range(length): #loop through 0 to length-1 (because, 0 based indexing)
if a[i]==maximumValue: #if any value of list a is equal to maximum value then store its index to maxIndexList
maxIndexList.append(i)
print(maxIndexList) #finally print the list
목록의 길이를 계산하지 않고 변수에 최대값을 저장하지 않는 다른 방법으로,
maxIndexList = list()
index = 0 #variable to store index
for i in a: #iterate through the list (actually iterating through the value of list, not index )
if i==max(a): #max(a) returns a maximum value of list.
maxIndexList.append(index) #store the index of maximum value
index = index+1 #increment the index
print(maxIndexList)
우리는 그것을 피토닉하고 똑똑한 방법으로 할 수 있어요!목록 이해를 한 줄에만 사용하면,
maxIndexList = [i for i,j in enumerate(a) if j==max(a)] #here,i=index and j = value of that index
내 모든 코드는 파이썬 3에 있다.
여기 간단한 싱글패스 솔루션이 있습니다.
import math
nums = [32, 37, 28, 30, 37, 25, 55, 27, 24, 35, 55, 23, 31]
max_val = -math.inf
res = []
for i, val in enumerate(nums):
if(max_val < val):
max_val = val
res = [i]
elif(max_val == val):
res.append(i)
print(res)
import operator
def max_positions(iterable, key=None, reverse=False):
if key is None:
def key(x):
return x
if reverse:
better = operator.lt
else:
better = operator.gt
it = enumerate(iterable)
for pos, item in it:
break
else:
raise ValueError("max_positions: empty iterable")
# note this is the same exception type raised by max([])
cur_max = key(item)
cur_pos = [pos]
for pos, item in it:
k = key(item)
if better(k, cur_max):
cur_max = k
cur_pos = [pos]
elif k == cur_max:
cur_pos.append(pos)
return cur_max, cur_pos
def min_positions(iterable, key=None, reverse=False):
return max_positions(iterable, key, not reverse)
>>> L = range(10) * 2
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> max_positions(L)
(9, [9, 19])
>>> min_positions(L)
(0, [0, 10])
>>> max_positions(L, key=lambda x: x // 2, reverse=True)
(0, [0, 1, 10, 11])
이 코드는 이전에 게시된 답변만큼 복잡하지는 않지만 다음과 같이 작동합니다.
m = max(a)
n = 0 # frequency of max (a)
for number in a :
if number == m :
n = n + 1
ilist = [None] * n # a list containing index values of maximum number in list a.
ilistindex = 0
aindex = 0 # required index value.
for number in a :
if number == m :
ilist[ilistindex] = aindex
ilistindex = ilistindex + 1
aindex = aindex + 1
print ilist
위 코드의 ilist에는 목록의 최대 개수의 위치가 모두 포함됩니다.
언급URL : https://stackoverflow.com/questions/3989016/how-to-find-all-positions-of-the-maximum-value-in-a-list
'programing' 카테고리의 다른 글
| MySQL 쿼리 실행을 중지하려면 어떻게 해야 합니까? (0) | 2022.10.23 |
|---|---|
| TypeScript, 사전을 통한 루프 (0) | 2022.10.23 |
| HTML5 WebSockets보다 AJAX의 긴/짧은 폴링은 어떤 상황에서 선호됩니까? (0) | 2022.10.23 |
| MySQL Workbench에서 테이블 생성 스크립트를 가져오려면 어떻게 해야 합니까? (0) | 2022.10.23 |
| Java에서 명명된 매개 변수 관용어 (0) | 2022.10.23 |