Відповіді:
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
a.index(max(a))
підкаже вам індекс першої інстанції найбільшого цінного елемента списку a.
Обрана відповідь (і більшість інших) потребують щонайменше двох переходів через список.
Ось однопропускне рішення, яке може бути кращим вибором для більш довгих списків.
Відредаговано: Для усунення двох недоліків, на які вказував @John Machin. Для (2) Я намагався оптимізувати тести, виходячи із здогаданої ймовірності виникнення кожної умови та умовиводів, дозволених попередниками. Це було трохи складніше з'ясувати правильні значення ініціалізації для max_valі max_indicesякі працювали для всіх можливих випадків, особливо якщо максимальне сталося, перше значення в списку - але я вважаю , що це тепер робить.
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
[]як оголошено ("Список повернення"). Код повинен бути просто if not seq: return []. (2) Схема тестування в циклі є неоптимальною: в середньому у випадкових списках умова val < maxvalбуде найпоширенішою, але наведений вище код має 2 тести замість одного.
==замість 2 - ваш elifстан завжди буде вірним.
elifсамого True , FWIW. ;-)
Я придумав наступне, і воно працює, як ви бачите max, minта інші функції над такими списками:
Отже, будь ласка, розгляньте наступний приклад списку, щоб дізнатись позицію максимуму у списку a:
>>> a = [3,2,1, 4,5]
Використання генератора enumerate та проведення кастингу
>>> list(enumerate(a))
[(0, 3), (1, 2), (2, 1), (3, 4), (4, 5)]
У цей момент ми можемо витягнути положення макс за допомогою
>>> max(enumerate(a), key=(lambda x: x[1]))
(4, 5)
Вище сказане нам говорить, що максимум знаходиться в положенні 4, а його значення - 5.
Як бачите, в keyаргументі ви можете знайти максимум над будь-яким ітерабельним об'єктом, визначивши лямбда відповідним.
Я сподіваюся, що це сприяє.
ПД: Як зазначив @PaulOyster у коментарі. За Python 3.xдопомогою minі maxдозвольте нове ключове слово, defaultяке уникає виключення підвищення, ValueErrorколи аргумент порожній список.max(enumerate(list), key=(lambda x:x[1]), default = -1)
Я не можу відтворити виступ @ SilentGhost, який цитує @martineau. Ось мої зусилля щодо порівнянь:
=== 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
Результати старого ноутбука, який працює з Python 2.7 на Windows XP SP3:
>\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
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
Саме так я зазвичай це роблю.
Ви також можете використовувати пакет numpy:
import numpy as np
A = np.array(a)
maximum_indices = np.where(A==max(a))
Це поверне нумерований масив усіх індексів, що містять максимальне значення
якщо ви хочете перетворити це на список:
maximum_indices_list = maximum_indices.tolist()
Пітонічним способом знайти індекс елемента максимального списку було б
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
Ось максимальне значення та індекси, які воно з’являється при:
>>> 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]
heapq- знаходження максимуму було б тривіальним.
heapqрішення, я сумніваюся, що це спрацює.
Аналогічна ідея із розумінням списку, але без перерахування
m = max(a)
[i for i in range(len(a)) if a[i] == m]
a[i]дзвінок.
Всього один рядок:
idx = max(range(len(a)), key = lambda i: a[i])
Якщо ви хочете отримати індекси найбільшої nкількості у списку, який називається data, ви можете скористатися Pandas sort_values:
pd.Series(data).sort_values(ascending=False).index[0:n]
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 у наведеному вище коді міститиме всі позиції максимальної кількості у списку.
Зробити це можна різними способами.
Старий звичайний спосіб,
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
Всі мої коди в Python 3.