जवाबों:
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
a.index(max(a))
आपको सूची के सबसे बड़े मूल्यवान तत्व के पहले उदाहरण का सूचकांक बताएगा a
।
चुने गए उत्तर (और अधिकांश अन्य) को सूची से कम से कम दो पास की आवश्यकता होती है।
यहां एक पास समाधान है जो लंबी सूचियों के लिए बेहतर विकल्प हो सकता है।
संपादित: @ जॉन माचिन द्वारा बताई गई दो कमियों को दूर करने के लिए। (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 के बजाय दुर्लभ मामले में अब 3 परीक्षण करता है - आपकी elif
स्थिति हमेशा सच होगी।
elif
खुद को पकड़ा , 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
तर्क में, आप लंबरदार को परिभाषित करके किसी भी चलने योग्य वस्तु पर अधिकतम पा सकते हैं।
मुझे उम्मीद है कि यह योगदान देता है।
PD: @PaulOyster के रूप में एक टिप्पणी में उल्लेख किया। साथ और एक नया कीवर्ड की अनुमति देते हैं कि उठाने के अपवाद से बचने जब तर्क खाली सूची है।Python 3.x
min
max
default
ValueError
max(enumerate(list), key=(lambda x:x[1]), default = -1)
मैं @martineau द्वारा उद्धृत @ साइलेंटगॉस्ट-बीटिंग प्रदर्शन को पुन: पेश नहीं कर सकता। तुलना के साथ यहाँ मेरा प्रयास है:
=== मैक्सिममेडिशोमा ===
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
विंडोज XP SP3 पर पायथन 2.7 चलाने वाले एक पुराने लैपटॉप से परिणाम:
>\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
ऐसा मैं आमतौर पर करता हूं।
तुम भी खस्ता पैकेज का उपयोग कर सकते हैं:
import numpy as np
A = np.array(a)
maximum_indices = np.where(A==max(a))
यह उन सभी सूचकांकों का एक सुस्पष्ट सरणी लौटाएगा, जिनमें अधिकतम मूल्य होता है
यदि आप इसे सूची में बदलना चाहते हैं:
maximum_indices_list = maximum_indices.tolist()
>>> max(enumerate([1,2,3,32,1,5,7,9]),key=lambda x: x[1])
>>> (3, 32)
@ शश ने इसका जवाब कहीं और दिया
अधिकतम सूची तत्व के सूचकांक को खोजने का एक पायथनिक तरीका होगा
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
, तो आप पंडों का उपयोग कर सकते हैं 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
मेरे सभी कोड पायथन 3 में हैं।