Jawaban:
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
a.index(max(a))
akan memberi tahu Anda indeks instance pertama dari elemen daftar bernilai terbesar a
.
Jawaban yang dipilih (dan sebagian besar lainnya) memerlukan setidaknya dua melewati daftar.
Inilah solusi satu lulus yang mungkin menjadi pilihan yang lebih baik untuk daftar yang lebih panjang.
Diedit: Untuk mengatasi dua kekurangan yang ditunjukkan oleh @John Machin. Untuk (2) saya mencoba untuk mengoptimalkan tes berdasarkan probabilitas dugaan kemunculan dari setiap kondisi dan kesimpulan yang diizinkan dari para pendahulu. Agak sulit mencari tahu nilai inisialisasi yang tepat untuk max_val
dan max_indices
yang bekerja untuk semua kasus yang mungkin, terutama jika maks kebetulan adalah nilai pertama dalam daftar - tapi saya percaya sekarang melakukannya.
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
[]
seperti yang diiklankan ("Daftar pengembalian "). Kode harus sederhana if not seq: return []
. (2) Skema pengujian dalam loop adalah sub-optimal: rata-rata dalam daftar acak, kondisi val < maxval
akan menjadi yang paling umum tetapi kode di atas mengambil 2 tes, bukan satu.
==
bukan 2 - elif
kondisi Anda akan selalu benar.
elif
sendiri, FWIW. ;-)
Saya datang dengan yang berikut dan berfungsi seperti yang Anda lihat max
, min
dan yang lain berfungsi di daftar seperti ini:
Jadi, harap pertimbangkan contoh daftar berikut ini untuk mengetahui posisi maksimum dalam daftar a
:
>>> a = [3,2,1, 4,5]
Menggunakan generator enumerate
dan membuat casting
>>> list(enumerate(a))
[(0, 3), (1, 2), (2, 1), (3, 4), (4, 5)]
Pada titik ini, kita dapat mengekstraksi posisi max dengan
>>> max(enumerate(a), key=(lambda x: x[1]))
(4, 5)
Di atas memberitahu kita, maksimum ada di posisi 4 dan nilainya 5.
Seperti yang Anda lihat, dalam key
argumen, Anda dapat menemukan maksimum di atas objek yang dapat diulang dengan mendefinisikan lambda yang sesuai.
Saya harap ini berkontribusi.
PD: Seperti yang dicatat oleh @PaulOyster dalam komentar. Dengan Python 3.x
yang min
dan max
memungkinkan kata kunci baru default
yang menghindari pengecualian kenaikan ValueError
ketika argumen adalah daftar kosong.max(enumerate(list), key=(lambda x:x[1]), default = -1)
Saya tidak dapat mereproduksi kinerja pemukulan @ SilentGhost yang dikutip oleh @martineau. Inilah upaya saya dengan perbandingan:
=== 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
Hasil dari laptop lama usang yang menjalankan Python 2.7 pada 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
Begitulah biasanya saya melakukannya.
Anda juga dapat menggunakan paket numpy:
import numpy as np
A = np.array(a)
maximum_indices = np.where(A==max(a))
Ini akan mengembalikan array numpy dari semua indeks yang berisi nilai maks
jika Anda ingin mengubah ini menjadi daftar:
maximum_indices_list = maximum_indices.tolist()
@shash menjawab ini di tempat lain
Cara Pythonic untuk menemukan indeks elemen daftar maksimum adalah
position = max(enumerate(a), key=lambda x: x[1])[0]
Yang satu lulus . Namun, ini lebih lambat daripada solusi oleh @Silent_Ghost dan, lebih dari itu, @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
Berikut adalah nilai maks dan indeks yang muncul di:
>>> 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]
Kemudian: untuk kepuasan @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
- menemukan max akan ada sepele.
heapq
solusi Anda , saya ragu itu akan berhasil.
Gagasan serupa dengan pemahaman daftar tetapi tanpa menyebutkan
m = max(a)
[i for i in range(len(a)) if a[i] == m]
a[i]
panggilan.
Hanya satu baris:
idx = max(range(len(a)), key = lambda i: a[i])
Jika Anda ingin mendapatkan indeks n
angka terbesar dalam daftar yang dipanggil data
, Anda dapat menggunakan 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])
Kode ini tidak secanggih jawaban yang diposting sebelumnya tetapi akan berfungsi:
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
daftar dalam kode di atas akan berisi semua posisi dari jumlah maksimum dalam daftar.
Anda dapat melakukannya dengan berbagai cara.
Cara konvensional yang lama adalah,
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
Cara lain tanpa menghitung panjang daftar dan menyimpan nilai maksimum ke variabel apa pun,
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)
Kita bisa melakukannya dengan Pythonic dan cara yang cerdas! Menggunakan pemahaman daftar hanya dalam satu baris,
maxIndexList = [i for i,j in enumerate(a) if j==max(a)] #here,i=index and j = value of that index
Semua kode saya dalam Python 3.