Yanıtlar:
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
a.index(max(a))
size listenin en büyük değerli öğesinin ilk örneğinin dizinini söyleyecektir a
.
Seçilen cevap (ve çoğu diğer) listeden en az iki geçiş gerektirir.
Daha uzun listeler için daha iyi bir seçim olabilecek tek geçişli bir çözüm.
Düzenlendi: @ John Machin tarafından belirtilen iki eksikliği gidermek için. (2) için her bir durumun ve seleflerin izin verdiği çıkarımların tahmin edilen olasılığını temel alarak testleri optimize etmeye çalıştım. Bunun için uygun başlatma değerlerini bulmaktan biraz zor oldu max_val
ve max_indices
maksimum listedeki ilk değer olması oldu, özellikle eğer mümkünse durumlar için çalıştığı - ama artık biliyor inanıyoruz.
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
[]
Reklamı yapılan gibi ("Dönüş listesi") dönmelidir . Kod basit olmalıdır if not seq: return []
. (2) Döngüdeki test şeması alt optimaldir: ortalama olarak rastgele listelerde durum val < maxval
en yaygın olacaktır, ancak yukarıdaki kod bir yerine 2 test alır.
==
2 yerine nadir durumlarda 3 test yapar - elif
durumunuz her zaman doğru olacaktır.
elif
Kendimi her zaman Gerçek olarak yakaladım FWIW. ;-)
Ben aşağıda ile geldi ve bunu birlikte görebileceğiniz gibi çalışır max
, min
bu gibi listelerin üzerine fonksiyonları ve diğerleri:
Yani, konumunu öğrenmek Sonraki örnek listesini düşünün lütfen maksimum listesinde a
:
>>> a = [3,2,1, 4,5]
Jeneratörü kullanma enumerate
ve döküm yapma
>>> list(enumerate(a))
[(0, 3), (1, 2), (2, 1), (3, 4), (4, 5)]
Bu noktada, pozisyonunu çıkarabilir max ile
>>> max(enumerate(a), key=(lambda x: x[1]))
(4, 5)
Yukarıda anlatılanlar, maksimum 4 pozisyonunda ve değeri 5'tir.
Gördüğünüz gibi, key
argümanda, uygun bir lambda tanımlayarak, yinelenebilir herhangi bir nesne üzerindeki maksimum değeri bulabilirsiniz.
Umarım katkıda bulunur.
PD: @PaulOyster'ın bir yorumda belirttiği gibi. İle ve yeni bir anahtar kelime izin zam istisna önlemek argüman boş liste olduğunda.Python 3.x
min
max
default
ValueError
max(enumerate(list), key=(lambda x:x[1]), default = -1)
@Martineau tarafından alıntılanan @ SilentGhost dayak performansını çoğaltamıyorum. İşte karşılaştırma ile benim çaba:
=== 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'te Python 2.7 çalıştıran eski bir dizüstü bilgisayarın sonuçları:
>\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
Ben genellikle böyle yaparım.
Numpy paketini de kullanabilirsiniz:
import numpy as np
A = np.array(a)
maximum_indices = np.where(A==max(a))
Bu, maks değerini içeren tüm dizinlerin sayısal bir dizisini döndürür
bunu bir listeye dönüştürmek istiyorsanız:
maximum_indices_list = maximum_indices.tolist()
@shash bunu başka bir yerde yanıtladı
Maksimum liste öğesinin dizinini bulmanın Pythonic yolu
position = max(enumerate(a), key=lambda x: x[1])[0]
Hangisi geçer . Yine de, @Silent_Ghost ve daha da fazlası @nmichaels'ın çözümünden daha yavaştır:
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
İşte maksimum değeri ve göründüğü dizinler:
>>> 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]
Daha sonra: @SilentGhost'un memnuniyeti için
>>> 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
- maksimum değeri bulmak önemsiz olurdu.
heapq
çözümünüzü görmek isterken işe yarayacağından şüpheliyim.
Bir liste kavrayışı ile ama numarasız benzer fikir
m = max(a)
[i for i in range(len(a)) if a[i] == m]
a[i]
çağrı nedeniyle numaralandırma ile çözümden kesinlikle daha yavaş .
Sadece bir satır:
idx = max(range(len(a)), key = lambda i: a[i])
Listelenen n
bir listede en büyük sayıların indekslerini almak data
istiyorsanız, Pandaları kullanabilirsiniz 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])
Bu kod, daha önce gönderilen cevaplar kadar karmaşık değildir, ancak çalışır:
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
Yukarıdaki koddaki ilist , listede maksimum sayının tüm konumlarını içerecektir.
Bunu çeşitli şekillerde yapabilirsiniz.
Eski geleneksel yol,
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
Listenin uzunluğunu hesaplamadan ve herhangi bir değişkene maksimum değer kaydetmeden başka bir yol,
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)
Pythonic ve akıllı bir şekilde yapabiliriz! Liste kavrayışı sadece bir satırda kullanmak,
maxIndexList = [i for i,j in enumerate(a) if j==max(a)] #here,i=index and j = value of that index
Tüm kodlarım Python 3'te.