किसी सूची में अधिकतम मूल्य के सभी पदों को कैसे खोजें?


152

मेरे पास एक सूची है:

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]

अधिकतम तत्व 55 है (स्थिति 9 और 12 पर दो तत्व)

मुझे यह पता लगाने की आवश्यकता है कि किस स्थिति में अधिकतम मूल्य स्थित है। कृपया सहायता कीजिए।

जवाबों:


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

4
यदि आप सूची से कई पास बनाने का मन नहीं बनाते हैं, तो अच्छा लघु उत्तर - जो कि संभावना है।
मार्टिउ

इसके लिए बड़े 0 को छोड़कर 2n है, सूची 2x के माध्यम से पुनरावृत्त होती है, एक बार अधिकतम निर्धारित करने के लिए, और अधिकतम के पदों को खोजने के लिए एक और समय। लूप के लिए जो वर्तमान अधिकतम को ट्रैक करता है और इसकी स्थिति वास्तव में लंबी सूचियों के लिए अधिक कुशल हो सकती है।
राडटेक

1
@ ब्रैडटेक बड़ा ओ अभी n है। प्रमुख गुणांक को बड़े O
michaelsnowden

1
सैद्धांतिक रूप से O (N) और O (2N) समान हैं, लेकिन व्यावहारिक रूप से, O (N) में निश्चित रूप से कम चलने का समय होगा, विशेष रूप से N के रूप में अनन्तता।
राडटेक

314
a.index(max(a))

आपको सूची के सबसे बड़े मूल्यवान तत्व के पहले उदाहरण का सूचकांक बताएगा a


8
हालांकि यह आपको केवल पहला उदाहरण मिलेगा और उसने उन सभी अनुक्रमों के लिए कहा जहां सबसे बड़ा मूल्य पाया जाता है। आपको प्रत्येक मामले में शेष सूची प्राप्त करने के लिए स्लाइस का उपयोग करना और अपवाद को संभालना होगा जब इसे अब नहीं मिला है।
jaydel

10
मैंने उल्लेख किया है कि यह केवल पहला उदाहरण देगा। यदि आप उन सभी को चाहते हैं, तो साइलेंटगॉस्ट का समाधान बहुत ही सुंदर और कम त्रुटि वाला है।
नौचमेल्स

7
कम से कम जैसा कि मैं आया था, सवाल स्पष्ट रूप से कई मैक्सिमा के मामले में एक सूची के लिए पूछता है ...
Emmagras

2
तकनीकी रूप से, आप इसका उपयोग सबसे बड़े मूल्यवान तत्व के पहले उदाहरण को प्राप्त करने के लिए कर सकते हैं और फिर इसे हास्यास्पद रूप से बड़े ऋणात्मक संख्या में सेट कर सकते हैं, और फिर अगला सबसे बड़ा मूल्यवान तत्व खोज सकते हैं, लेकिन यह बहुत जटिल होगा।
नील चौधरी

@nmichaels किसी भी स्वीकृत उत्तर की तुलना में किसी सूची में अधिकतम मान के सभी स्थान प्राप्त करने का कोई सबसे अच्छा तरीका है?
शीक मोईद

18

चुने गए उत्तर (और अधिकांश अन्य) को सूची से कम से कम दो पास की आवश्यकता होती है।
यहां एक पास समाधान है जो लंबी सूचियों के लिए बेहतर विकल्प हो सकता है।

संपादित: @ जॉन माचिन द्वारा बताई गई दो कमियों को दूर करने के लिए। (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

4
(1) खाली सूची हैंडलिंग पर ध्यान देने की आवश्यकता है। []विज्ञापित के रूप में लौटना चाहिए ("वापसी सूची")। कोड बस होना चाहिए if not seq: return []। (2) लूप में परीक्षण योजना उप-इष्टतम है: यादृच्छिक सूचियों में औसतन, स्थिति val < maxvalसबसे सामान्य होगी लेकिन उपरोक्त कोड एक के बजाय 2 परीक्षण करता है।
जॉन मैकिन

डॉकस्ट्रिंग के साथ असंगति को पकड़ने और मुझे उप-इष्टतम कोड पोस्ट करने से दूर नहीं होने देने के लिए +1 से @ जोहान माचिन की टिप्पणी। सच कहें तो, क्योंकि एक उत्तर पहले से ही स्वीकार कर लिया गया था, मैंने अपने उत्तर पर काम करना जारी रखने के लिए प्रेरणा का एक सा खो दिया, क्योंकि मैंने माना कि शायद ही कोई आगे भी इसे देखेगा - और यह बाकी सभी की तुलना में बहुत लंबा है।
मार्टीन्यू

1
@martineau: "स्वीकार किए जाते हैं" उत्तर जरूरी "स्वीकार्य" नहीं हैं। मैं आमतौर पर सभी उत्तर पढ़ता हूं। अपने संशोधन सहित। जो ==2 के बजाय दुर्लभ मामले में अब 3 परीक्षण करता है - आपकी elifस्थिति हमेशा सच होगी।
जॉन मैकिन

@ जॉन माचिन: ​​मैं वास्तव में प्रेरित हुआ और आगे भी इसे संशोधित किया। अब यह न्यूनतम अतिरिक्त परीक्षणों के साथ-साथ कुछ अन्य मोड़ भी है। आपकी टिप्पणियों और रचनात्मक आलोचनाओं के लिए धन्यवाद। मैं हमेशा सच elifखुद को पकड़ा , FWIW। ;-)
मार्टिन

@ जॉन माचिन: ​​हम्म, आपके समय के परिणाम मेरे खुद के विरोधाभासी प्रतीत होते हैं, इसलिए मैं समय के बारे में अपने उत्तर में कही गई बातों को हटा दूंगा, ताकि आगे जो हो रहा है, उस पर गौर कर सकूं। सर उठाने के लिए धन्यवाद। वास्तव में मुझे लगता है कि एक "वास्तविक" समय परीक्षण को यादृच्छिक सूची मूल्यों का उपयोग करने की आवश्यकता होगी।
मार्टीन्यू

10

मैं निम्नलिखित के साथ आया था और यह काम करता है जैसा कि आप देख सकते हैं 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.xminmaxdefaultValueErrormax(enumerate(list), key=(lambda x:x[1]), default = -1)


2
यह एक बेहतर समाधान है, क्योंकि इसमें एकल पास शामिल है। कुछ टिप्पणियाँ, हालांकि: 1. सूची की जरूरत नहीं है () गणन, 2. लंबोदर बेहतर रूप से छोटा किया जा सकता है, 3. न्यूनतम () और अधिकतम () में अब एक डिफ़ॉल्ट पैरामीटर है (जो खाली इनपुट पर वापस आ गया है), इसलिए उपयोग कर सकते हैं यह (डिफ़ॉल्ट = -1, उदाहरण के लिए) एक ValueError अपवाद से बचने के लिए, और 4. कृपया अधिकतम () में बदलें, क्योंकि यह मूल प्रश्न था।
पॉल ऑइस्टर

के बारे में 3 आइटम, हाँ, यह सिर्फ पायथन 3.x के साथ काम करता है। उसका उल्लेख करूंगा। और बाकी सब कुछ तय कर दिया। ;)
जोंप्रिटो

2
जब यह सूची में एक से अधिक बार होता है, तो यह अधिकतम मूल्यवान तत्वों (पहले) में से एक की स्थिति का पता लगाएगा - इसलिए पूछे गए प्रश्न का उत्तर नहीं देता है।
मार्टीन्यू

8

मैं @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

7
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

ऐसा मैं आमतौर पर करता हूं।


6

तुम भी खस्ता पैकेज का उपयोग कर सकते हैं:

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

यह उन सभी सूचकांकों का एक सुस्पष्ट सरणी लौटाएगा, जिनमें अधिकतम मूल्य होता है

यदि आप इसे सूची में बदलना चाहते हैं:

maximum_indices_list = maximum_indices.tolist()

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

ये गलत है। सूची के मध्य में अधिकतम संख्या डालने का प्रयास करें।
गोनोकॉप्लॉप

1
ये गलत है। प्रश्न कहता है "अधिकतम मूल्य के सभी पदों को ढूंढें"।
कपिल

5

इसके अलावा एक समाधान, जो केवल पहली उपस्थिति देता है , का उपयोग करके प्राप्त किया जा सकता है numpy:

>>> import numpy as np
>>> a_np = np.array(a)
>>> np.argmax(a_np)
9

3

@ शश ने इसका जवाब कहीं और दिया

अधिकतम सूची तत्व के सूचकांक को खोजने का एक पायथनिक तरीका होगा

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

2

यहाँ अधिकतम मान है और यह जिस सूचकांक में दिखाई देता है:

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

आपको एहसास है कि यह कितना अक्षम है?
साइलेंटगॉस्ट

1
युक्तिकरण: (1) "समय से पहले अनुकूलन ... है" (२) यह शायद मायने नहीं रखता। (३) यह अभी भी एक अच्छा समाधान है। हो सकता है कि मैं इसका इस्तेमाल करने के लिए फिर से तैयार करूं heapq- अधिकतम ढूँढना वहाँ तुच्छ होगा।
हुग्डब्रोर्न

जब तक मैं आपके heapqसमाधान को देखना पसंद करूंगा, मुझे संदेह है कि यह काम करेगा।
साइलेंटगॉस्ट

2

एक सूची की समझ के साथ समान विचार, लेकिन बिना गणना के

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

मैं नीच नहीं हूं, लेकिन ध्यान दें कि यह वास्तव में अच्छा नहीं दिखता है और यह अच्छा प्रदर्शन नहीं करेगा: सूची के माध्यम से सूचकांकों के माध्यम से पुनरावृत्ति करना पायथन में बहुत अजीब है, आप इससे बचने की कोशिश करते हैं। साथ ही, यह निश्चित रूप से a[i]कॉल की वजह से गणना के साथ समाधान की तुलना में धीमी है ।
यो '

1

बस एक पंक्ति:

idx = max(range(len(a)), key = lambda i: a[i])

अच्छा है, लेकिन यह सभी अनुक्रमितों को वापस नहीं करता है, बस पहले वाला है।
आईजी

1

यदि आप nसूची में सबसे बड़ी संख्या के सूचकांकों को प्राप्त करना चाहते हैं data, तो आप पंडों का उपयोग कर सकते हैं sort_values:

pd.Series(data).sort_values(ascending=False).index[0:n]

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

0

यह कोड उतने परिष्कृत नहीं हैं जितने उत्तर पहले पोस्ट किए गए हैं लेकिन यह काम करेगा:

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 में सूची में अधिकतम संख्या के सभी पद शामिल होंगे।


0

आप इसे विभिन्न तरीकों से कर सकते हैं।

पुराना पारंपरिक तरीका है,

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 में हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.