Mam 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]
max elementu to 55 (dwa elementy na pozycjach 9 i 12)
Muszę dowiedzieć się, na których pozycjach znajduje się maksymalna wartość. Proszę pomóż.
poda indeks pierwszej instancji elementu listy o największej wartości
a
.źródło
Wybrana odpowiedź (i większość innych) wymaga co najmniej dwóch przejść przez listę.
Oto rozwiązanie jednoprzebiegowe, które może być lepszym wyborem w przypadku dłuższych list.
Edytowano: aby usunąć dwa niedociągnięcia wskazane przez @John Machin. Dla (2) podjąłem próbę optymalizacji testów na podstawie oszacowanego prawdopodobieństwa wystąpienia każdego warunku i wniosków uzyskanych od poprzedników. To było trochę trudne zastanawianie się odpowiednie wartości dla inicjowania
max_val
imax_indices
który pracował dla wszystkich możliwych przypadkach, zwłaszcza jeśli max okazał się być pierwsza wartość na liście - ale uważam, że teraz robi.źródło
[]
zgodnie z reklamą („Lista zwrotów”). Kod powinien być prostyif not seq: return []
. (2) Schemat testowania w pętli jest nieoptymalny: średnio na listach losowych warunekval < maxval
będzie najczęściej, ale powyższy kod wymaga 2 testów zamiast jednego.==
zamiast 2 - twójelif
stan zawsze będzie prawdziwy.elif
, FWIW. ;-)Wymyśliłem następujące i działa tak, jak widać
max
,min
a inne funkcje na listach takich jak te:Tak więc, rozważ następną przykładową listę, aby znaleźć pozycję maksimum na liście
a
:Korzystanie z generatora
enumerate
i wykonanie odlewuW tym momencie możemy wyodrębnić pozycję max za pomocą
Powyższe mówi nam, że maksimum jest na pozycji 4, a jego wartość to 5.
Jak widzisz, w
key
argumencie możesz znaleźć maksimum dla dowolnego iterowalnego obiektu, definiując odpowiednią lambdę.Mam nadzieję, że to przyczyni się.
PD: Jak zauważył @PaulOyster w komentarzu. Z i umożliwiają nowe słowo kluczowe , które unikają wyjątek podbicia gdy argument jest pusta lista.
Python 3.x
min
max
default
ValueError
max(enumerate(list), key=(lambda x:x[1]), default = -1)
źródło
Nie mogę odtworzyć wydajności @ SilentGhost cytowanej przez @martineau. Oto mój wysiłek z porównaniami:
=== maxelements.py ===
Wyniki ze zniszczonego starego laptopa z systemem Python 2.7 w systemie Windows XP SP3:
źródło
Tak zwykle robię.
źródło
Możesz także użyć pakietu numpy:
To zwróci tablicę numpy wszystkich indeksów, które zawierają wartość maksymalną
jeśli chcesz zamienić to na listę:
źródło
źródło
Również rozwiązanie, które daje tylko pierwszy wygląd , można uzyskać stosując
numpy
:źródło
@shash odpowiedział na to gdzie indziej
Który przechodzi . Jednak jest wolniejszy niż rozwiązanie @Silent_Ghost, a tym bardziej @nmichaels:
źródło
Oto maksymalna wartość i indeksy, w których się pojawia:
Później: dla satysfakcji @SilentGhost
źródło
heapq
- znalezienie tam maksimum byłoby trywialne.heapq
rozwiązanie, wątpię, żeby zadziałało.Podobny pomysł ze zrozumieniem listy, ale bez wyliczania
źródło
a[i]
połączenia.Tylko jedna linia:
źródło
Jeśli chcesz uzyskać indeksy największych
n
liczb na wywołanej liściedata
, możesz użyć Pandsort_values
:źródło
źródło
Ten kod nie jest tak wyrafinowany jak odpowiedzi zamieszczone wcześniej, ale zadziała:
ilist w powyższym kodzie zawierałby wszystkie pozycje maksymalnej liczby na liście.
źródło
Możesz to zrobić na różne sposoby.
Stary konwencjonalny sposób to
Innym sposobem bez obliczania długości listy i przechowywania maksymalnej wartości dowolnej zmiennej,
Możemy to zrobić w Pythonic i sprytnie! Korzystanie ze zrozumienia list tylko w jednej linii,
Wszystkie moje kody są w Pythonie 3.
źródło