কিভাবে একটি তালিকায় সর্বাধিক মান সব অবস্থান খুঁজে?


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 এর মাধ্যমে পুনরাবৃত্তি করা হয়, একবার সর্বোচ্চ নির্ধারণ করার জন্য, এবং আরও একটি সময় সর্বোচ্চের অবস্থানগুলি সন্ধান করতে। লুপের জন্য একটি যা বর্তমান সর্বাধিক ট্র্যাক করে এবং এর অবস্থান সত্যিকারের দীর্ঘ তালিকার জন্য আরও কার্যকর হতে পারে।
Radtek

1
@radtek বিগ হে ঠিক এন। শীর্ষস্থানীয় গুণাগুণগুলি বড় হে
মাইক্রেলসনোডনউদ্দিন

1
তাত্ত্বিকভাবে ও (এন) এবং ও (2 এন) একই তবে তবে ব্যবহারিকভাবে, ও (এন) এর স্পষ্টতই একটি ছোট সময় চলবে, বিশেষত এন অসীমের কাছে যাওয়ার কারণে।
র‌্যাডটেক

314
a.index(max(a))

আপনাকে তালিকার বৃহত্তম মূল্যবান উপাদানটির প্রথম উদাহরণের সূচকটি বলবে a


8
এটি কেবলমাত্র আপনাকে প্রথম উদাহরণটি দেবে এবং তিনি সমস্ত সূচকগুলির জন্য জিজ্ঞাসা করেছিলেন যেখানে সর্বাধিক মান পাওয়া যায়। প্রতিটি ক্ষেত্রে অবশিষ্ট তালিকা পেতে স্লাইস ব্যবহার করে আপনাকে লুপ করতে হবে এবং যখন আর আর খুঁজে পাওয়া যায় না তখন ব্যতিক্রমটি পরিচালনা করতে হবে।
জায়েদেল

10
আমি উল্লেখ করেছি যে এটি কেবল প্রথম উদাহরণ দেবে। আপনি যদি এই সমস্তগুলি চান তবে সাইলেন্টগোস্টের সমাধানটি অনেক সুন্দর এবং ত্রুটিযুক্ত প্রবণ।
nmichaels

7
কমপক্ষে আমি এর কাছে আসার সাথে সাথে প্রশ্নটি স্পষ্টভাবে একাধিক ম্যাক্সিমার ক্ষেত্রে একটি তালিকা চেয়েছে ...
এমমাগ্রাস

2
প্রযুক্তিগতভাবে, আপনি এটি ব্যবহার করতে পারেন বৃহত্তম মূল্যবান উপাদানের প্রথম উদাহরণটি পেতে এবং এটি একটি হাস্যকর আকারে বড় নেতিবাচক সংখ্যায় সেট করে এবং তারপরে পরবর্তী বৃহত্তম মূল্যবান উপাদানটি খুঁজে পেতে পারেন তবে এটি খুব জটিল be
নীল চৌধুরী

@nmichaels গৃহীত উত্তরের চেয়ে তালিকায় সর্বোচ্চ মানের সমস্ত পদ পাওয়ার জন্য কি সেরা উপায় আছে?
শাইকে মো।

18

নির্বাচিত উত্তরের (এবং বেশিরভাগ অন্যান্য) তালিকার মধ্য দিয়ে কমপক্ষে দুটি পাসের প্রয়োজন।
এখানে একটি পাস সমাধান রয়েছে যা দীর্ঘ তালিকার জন্য আরও ভাল পছন্দ হতে পারে।

সম্পাদিত: @ জন মাচিন নির্দেশিত দুটি ঘাটতি পূরণ করার জন্য। (২) আমি পূর্বসূরিদের অনুমতিপ্রাপ্ত প্রতিটি শর্ত এবং অনুমানের সংঘটন হওয়ার অনুমানযুক্ত সম্ভাবনার উপর ভিত্তি করে পরীক্ষাগুলি অনুকূলকরণের চেষ্টা করেছি। এটি যথাযথ আরম্ভের মানগুলি খুঁজে বের করা 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) খালি তালিকা পরিচালনার মনোযোগ প্রয়োজন needs []বিজ্ঞাপন হিসাবে প্রত্যাবর্তন করা উচিত ("প্রত্যাবর্তন তালিকা")। কোড সহজভাবে হওয়া উচিত if not seq: return []। (২) লুপে টেস্টিং স্কিমটি উপ-অনুকূল: এলোমেলো তালিকায় গড়ে শর্তটি val < maxvalসর্বাধিক সাধারণ হবে তবে উপরের কোডটি একটিটির পরিবর্তে ২ টি পরীক্ষা নেয়।
জন মাচিন

ডক্ট্রিংয়ের সাথে অসঙ্গতি ধরার জন্য এবং সাব-অনুকূল কোড পোস্ট করে আমাকে দূরে সরাতে না দেওয়ার জন্য জন ম্যাচিনের মন্তব্য +1 তে। সত্য কথা বলতে গেলে, যেহেতু একটি উত্তর ইতিমধ্যে গৃহীত হয়েছিল, তাই আমি আমার উত্তরটির উপর কাজ চালিয়ে যাওয়ার জন্য কিছুটা প্রেরণা হারিয়েছি, যেহেতু আমি ধরেই নিয়েছিলাম যে এর চেয়ে আরও বেশি কেউ এর দিকে তাকিয়ে থাকবে - এবং এটি অন্য সবার চেয়ে অনেক বেশি দীর্ঘ।
মার্টিনো

1
@ মার্টিনো: "গৃহীত" উত্তরগুলি "গ্রহণযোগ্য" নয় arily আমি সাধারণত সমস্ত উত্তর পড়ে। আপনার সংশোধন সহ যা 2 এর ==পরিবর্তে বিরল ক্ষেত্রে এখন 3 টি পরীক্ষা করে - আপনার elifঅবস্থা সর্বদা সত্য হবে।
জন মাচিন

@ জন মাচিন: আমি সত্যিই অনুপ্রাণিত হয়েছি এবং আরও আরও সংশোধন করেছি। এখন এটি সর্বনিম্ন অতিরিক্ত পরীক্ষাগুলি, আরও কয়েকটি টুইটকে কম করেছে। আপনার মন্তব্য এবং গঠনমূলক সমালোচনার জন্য ধন্যবাদ। আমি সর্বদা সত্য elifনিজেকে ধরে ফেলেছি, এফডাব্লুআইডাব্লু। ;-)
মার্টিনো

@ জন মাচিন: হুম, আপনার সময়সীমার ফলাফলগুলি আমার নিজের মতবিরোধ বলে মনে হচ্ছে, তাই সময় সম্পর্কে আমার উত্তরে আমি যা বলেছি তা আমি সরিয়ে ফেলব যাতে আরও কী ঘটছে তা আমি দেখতে পারি। সতর্ক থাকুন জন্য ধন্যবাদ. আসলে আমি মনে করি একটি "আসল" সময় পরীক্ষার জন্য এলোমেলো তালিকা মান ব্যবহার করা দরকার।
মার্টিনো

10

আমি নিম্নলিখিত নিয়ে এসেছেন এবং এটি কাজ করে আপনার সাথে দেখতে পারেন max, minএই মত তালিকা মাধ্যমে অন্যান্যদের এবং ফাংশন:

সুতরাং, দয়া করে পরবর্তী উদাহরণ তালিকায় বিবেচনা করুন তালিকার সর্বাধিকের অবস্থানটি সন্ধান করুন a:

>>> a = [3,2,1, 4,5]

জেনারেটর ব্যবহার করে enumerateএবং একটি ingালাই তৈরি করা

>>> 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আর্গুমেন্টে দেখেন যে কোনও ল্যাম্বডা উপযুক্ত হিসাবে সংজ্ঞা দিয়ে আপনি কোনও পুনরাবৃত্ত বস্তুর উপরে সর্বাধিক সন্ধান করতে পারেন।

আমি আশা করি এটির অবদান রয়েছে।

পিডি: যেমন @ পলঅয়েস্টার একটি মন্তব্যে উল্লেখ করেছেন। যুক্তিটি খালি তালিকার সাথে যুক্ত Python 3.xহওয়ার সাথে সাথে minএবং maxএমন একটি নতুন কীওয়ার্ডের অনুমতি দিন defaultযা উত্স ব্যতিক্রম ValueErrorএড়ায়।max(enumerate(list), key=(lambda x:x[1]), default = -1)


2
এটি একটি আরও ভাল সমাধান, যেহেতু এটিতে একটি একক পাস জড়িত। কয়েকটি মন্তব্য, যদিও: ১. গণনা তালিকাভুক্ত করার দরকার নেই, ২. লাম্বদা আরও ভাল বন্ধনী হিসাবে চিহ্নিত করা উচিত, ৩. মিনিট () এবং সর্বোচ্চ () এখন একটি ডিফল্ট প্যারামিটার রয়েছে (যা খালি ইনপুটটিতে ফিরে আসে), সুতরাং ব্যবহার করতে পারেন এটি (ডিফল্ট = -1, উদাহরণস্বরূপ) একটি ভ্যালুআরর ব্যতিক্রম এড়ানোর জন্য, এবং ৪ দয়া করে সর্বোচ্চ () এ পরিবর্তন করুন, কারণ এটি আসল প্রশ্ন ছিল।
পল ওয়েস্টার

প্রায় 3 টি আইটেম, হ্যাঁ, এটি পাইথন 3.x সঙ্গে কাজ করে। আমি এটি উল্লেখ করব। এবং অন্য সব কিছু স্থির করে দিয়েছেন। ;)
জোনাপ্রিয়তো

2
এটি কেবলমাত্র সর্বাধিক মূল্যবান উপাদানগুলির মধ্যে একটির (প্রথম) সন্ধান করতে পারে যখন তালিকায় এটি একাধিকবার ঘটে — সুতরাং জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না।
মার্টিনো

8

@ মার্টিনাউ দ্বারা উদ্ধৃত @ সাইলেন্টঘস্ট-বীট পারফরম্যান্সটি আমি পুনরুত্পাদন করতে পারব না। তুলনার সাথে এখানে আমার প্রচেষ্টা:

=== maxeament.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

উইন্ডোজ এক্সপি এসপি 3 তে পাইথন ২.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)

এটা ভুল. সর্বোচ্চ নম্বরটি তালিকার মাঝখানে রাখার চেষ্টা করুন।
goncalopp

1
এটা ভুল. প্রশ্ন বলছে "সর্বাধিক মানের সমস্ত অবস্থান সন্ধান করুন"।
কপিল

5

এছাড়াও একটি সমাধান, যা কেবল প্রথম উপস্থিতি দেয় , ব্যবহার করে অর্জন করা যেতে পারে numpy:

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

3

@ শ্যাশ এর উত্তর অন্যত্র দিয়েছেন

সর্বাধিক তালিকা উপাদানের সূচকটি খুঁজে পাওয়ার পাইথোনিক উপায় way

position = max(enumerate(a), key=lambda x: x[1])[0]

যা এক পাস করে । তবুও, এটি @ সাইলেন্ট_গোস্টের সমাধানের চেয়ে ধীর এবং আরও বেশি, @ এনমিক্যালস:

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]

পরে: @ সাইলেন্টগোস্টের সন্তুষ্টির জন্য

>>> 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) "অকালীন অপটিমাইজেশন হ ... ..." (2) এটি সম্ভবত কিছু যায় আসে না। (3) এটি এখনও একটি ভাল সমাধান। সম্ভবত আমি এটি ব্যবহার করতে পুনরায় বলব heapq- সেখানে সর্বাধিক সন্ধান করা তুচ্ছ হবে।
হিউডব্রাউন

আমি যখন আপনার heapqসমাধানটি দেখতে পছন্দ করি তখন আমার সন্দেহ হয় এটি কার্যকর হবে।
সাইলেন্টগোস্ট

2

একটি তালিকা বোঝার সঙ্গে কিন্তু গণনা ছাড়াই অনুরূপ ধারণা

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

আমি ডাউনভোটার নই, তবে নোট করুন যে এটি সত্যিই দুর্দান্ত দেখাচ্ছে না এবং ভাল অভিনয় করতে পারবেন না: তালিকার মাধ্যমে সূচকগুলির মাধ্যমে পুনরাবৃত্তি পাইথনে খুব বিশ্রী, আপনি এড়াতে চেষ্টা করুন। পাশাপাশি, a[i]কলটির কারণে এটি গণনার সাথে সমাধানের চেয়ে অবশ্যই ধীর ।
yo '

1

কেবল একটি লাইন:

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

দুর্দান্ত, তবে এটি সমস্ত সূচক ফেরত দেয় না, কেবল প্রথমটি।
iggy

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

উপরের কোডে আইলিস্ট তালিকায় সর্বাধিক সংখ্যার সব পদ থাকবে।


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 এ রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.