Wie finde ich alle Positionen des Maximalwertes in einer Liste?

Ich habe eine Liste:

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 Element ist 55 (zwei Elemente auf Position 9 und 12)

Ich muss auf welcher Position (en) der Maximalwert liegen. Bitte helfen Sie.

  • Python - Datei existiert nicht
  • Gibt es einen Einzele-Code, um Maximalwert in einer Matrix zu finden?
  • Python: Maximale Rekursionstiefe überschritten
  • Rückgabemaximalwert aus Pandendatensatz als Ganzes, nicht auf Spalte oder Zeilen basiert
  • Python: Nehmen Sie Max N Elemente aus einer Liste
  • So finden Sie die max. Nummer (n) in einer Liste mit gebundenen Nummern
  • Wie finde ich die Liste in einer Liste von Listen, deren Summe von Elementen am größten ist?
  • Python-finden Sie das Element mit maximaler Vorkommen in einer Liste
  • 15 Solutions collect form web for “Wie finde ich alle Positionen des Maximalwertes in einer Liste?”

     >>> m = max(a) >>> [i for i, j in enumerate(a) if j == m] [9, 12] 
     a.index(max(a)) 

    Wird Ihnen sagen, der Index der ersten Instanz des größten Wertes der Liste a .

    Die gewählte Antwort (und die meisten anderen) erfordert mindestens zwei Durchläufe durch die Liste.
    Hier ist eine One-Pass-Lösung, die eine bessere Wahl für längere Listen sein könnte.

    Bearbeitet: Um die beiden Mängel, die von @John Machin. Für (2) habe ich versucht, die Tests auf der Grundlage der guesstimierten Wahrscheinlichkeit des Auftretens jeder Bedingung und Schlußfolgerungen von Vorgängern zu optimieren. Es war ein wenig schwierig, die richtigen Initialisierungswerte für max_val und max_indices herauszufinden, die für alle möglichen Fälle funktionierten, besonders wenn das max zufällig der erste Wert in der Liste war – aber ich glaube es jetzt.

     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 

    Ich kann die von @martineau zitierte @ SilentGhost-Beating-Performance nicht reproduzieren. Hier ist meine Bemühung mit Vergleichen:

    === 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 

    Ergebnisse aus einem Beat-up alten Laptop läuft Python 2.7 auf 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 

    Ich kam mit dem folgenden und es funktioniert, wie Sie mit max , min und anderen Funktionen über Listen wie diese sehen können:

    Also, bitte beachten Sie die nächste Beispielliste finden Sie die Position des Maximums in der Liste a :

     >>> a = [3,2,1, 4,5] 

    Mit dem Generator enumerate und machen ein Casting

     >>> list(enumerate(a)) [(0, 3), (1, 2), (2, 1), (3, 4), (4, 5)] 

    Zu diesem Zeitpunkt können wir die Position von max mit extrahieren

     >>> max(enumerate(a), key=(lambda x: x[1])) (4, 5) 

    Das obige sagt uns, das Maximum ist in der Position 4 und sein Wert ist 5.

    Wie Sie sehen, können Sie im key das Maximum über ein beliebiges iterable Objekt finden, indem Sie ein Lambda entsprechend definieren.

    Ich hoffe, dass es dazu beiträgt.

    PD: Wie @PaulOyster in einem Kommentar notiert. Mit Python 3.x erlauben die min und max eine neue Keyword- default , die die Ausnahmereignis ValueError vermeiden, wenn das Argument eine leere Liste ist. max(enumerate(list), key=(lambda x:x[1]), default = -1)

    Sie können auch das numpy Paket benutzen:

     import numpy as np A = np.array(a) maximum_indices = np.where(A==max(a)) 

    Dies wird ein numpy Array aller Indizes zurückgeben, die den Maximalwert enthalten

    Wenn du dies zu einer Liste machen möchtest:

     maximum_indices_list = maximum_indices.tolist() 

    Hier ist der Maximalwert und die Indizes erscheint bei:

     >>> 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] 

    Später: zur Zufriedenheit von @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] 

    Nur eine Zeile:

     idx = max(range(len(a)), key = lambda i: a[i]) 
     >>> max(enumerate([1,2,3,32,1,5,7,9]),key=lambda x: x[1]) >>> (3, 32) 

    Ähnliche Idee mit einem Listenverständnis aber ohne Aufzählung

     m = max(a) [i for i in range(len(a)) if a[i] == m] 

    @shash antwortete das anderswo

    Eine Pythonische Möglichkeit, den Index des maximalen Listenelements zu finden, wäre

     position = max(enumerate(a), key=lambda x: x[1])[0] 

    Was passiert passiert Dennoch ist es langsamer als die Lösung von @Silent_Ghost und noch mehr, @nmichaels:

     for i in smjn; 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 
     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 

    So mache ich es normalerweise

     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]) 

    Dieser Code ist nicht so anspruchsvoll wie die Antworten, die früher veröffentlicht wurden, aber es wird funktionieren:

     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 im obigen Code würde alle Positionen der maximalen Zahl in der Liste enthalten.

    Sie können es auf verschiedene Weise tun.

    Der alte konventionelle Weg ist,

     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 

    Ein anderer Weg, ohne die Länge der Liste zu berechnen und den Maximalwert für jede Variable zu speichern,

     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) 

    Wir können es in pythonischer und kluger Weise machen! Mit List-Verständnis nur in einer Zeile,

     maxIndexList = [i for i,j in enumerate(a) if j==max(a)] #here,i=index and j = value of that index 

    Alle meine Codes sind in Python 3.

    Python ist die beste Programmiersprache der Welt.