পাইথোনিক উপায় একটি তালিকাতে সর্বাধিক মান এবং তার সূচক খুঁজে পেতে?


151

আমি যদি একটি তালিকার সর্বাধিক মান চাই তবে আমি কেবল লিখতে max(List)পারি তবে আমারও যদি সর্বোচ্চ মানের সূচকের প্রয়োজন হয়?

আমি এরকম কিছু লিখতে পারি:

maximum=0
for i,value in enumerate(List):
    if value>maximum:
        maximum=value
        index=i

তবে এটা আমার কাছে ক্লান্তিকর লাগছে।

এবং যদি আমি লিখি:

List.index(max(List))

তারপরে এটি তালিকাটি পুনরাবৃত্তি করবে।

একটি ভাল উপায় আছে কি?


"এটি দুইবার তালিকা পাস করবে" বলতে কী বোঝ? List.index (সর্বাধিক (তালিকা)) আমার জন্য কাজ করে।
mwcz

14
@ এমডব্লিউসি: সর্বাধিক মান নির্ধারণের জন্য তালিকাটি একবারে পুনরাবৃত্তি করবে, তারপরে সেই মানটির সূচকটি খুঁজে পাওয়ার জন্য এটি দ্বিতীয়বার পুনরাবৃত্তি করবে।

10
সর্বাধিক মানগুলি সদৃশ করা থাকলে list.index () সমস্যাযুক্ত হবে না?
লোগান ইয়াং

@ লোগানইয়াং হ্যাঁ একই মানযুক্ত দুটি আইটেম থাকতে পারে।
ফ্লোরিয়ান

যদি অর্ডারটি গুরুত্বপূর্ণ না হয় তবে আপনি তালিকা.সোর্ট () [- 1]
ফ্লোরিয়ান

উত্তর:


186

অনেকগুলি বিকল্প রয়েছে, উদাহরণস্বরূপ:

import operator
index, value = max(enumerate(my_list), key=operator.itemgetter(1))

2
আহ্, আমি এটি অন্য জায়গায় দেখেছি, তবে আমি ভেবেছিলাম এটি একটি টিপল নয়, কেবল একটি মান প্রদান করবে।
সানি 88

1
@ সানি ৮৮: keyকোন উপাদানটি সর্বাধিক তা নির্ধারণ করতে কেবল ফাংশনটি ব্যবহৃত হয়। উপাদান পরিবর্তন করা হয় না।
সোভেন মারনাচ 21 '12

6
@ সেভেনমার্নচ কেন key=lambda e: e[1]তার পরিবর্তে এবং এর মাধ্যমে আমদানি এড়াবেন না?
লাইফব্লেন্স

8
@ লাইফবালেন্স ব্যবহার itemgetter()করা দ্রুততর, এবং আমদানি এড়ানো কোনও অনুসরণ করার মতো লক্ষ্য নয়। বাহ্যিক নির্ভরতা এড়ানো কিছু ক্ষেত্রে সার্থক হতে পারে তবে স্ট্যান্ডার্ড লাইব্রেরি থেকে আমদানি একটি অ-ইস্যু।
সোভেন মারনাচ 11 ই

323

আমি মনে করি গৃহীত উত্তর দুর্দান্ত, তবে আপনি কেন তা স্পষ্টভাবে করবেন না? আমি মনে করি আরও বেশি লোক আপনার কোডটি বুঝতে পারে এবং এটি পিইপি 8 এর সাথে একমত হয়েছে:

max_value = max(my_list)
max_index = my_list.index(max_value)

এই পদ্ধতিটি গৃহীত উত্তরের চেয়ে প্রায় তিনগুণ দ্রুত:

import random
from datetime import datetime
import operator

def explicit(l):
    max_val = max(l)
    max_idx = l.index(max_val)
    return max_idx, max_val

def implicit(l):
    max_idx, max_val = max(enumerate(l), key=operator.itemgetter(1))
    return max_idx, max_val

if __name__ == "__main__":
    from timeit import Timer
    t = Timer("explicit(l)", "from __main__ import explicit, implicit; "
          "import random; import operator;"
          "l = [random.random() for _ in xrange(100)]")
    print "Explicit: %.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)

    t = Timer("implicit(l)", "from __main__ import explicit, implicit; "
          "import random; import operator;"
          "l = [random.random() for _ in xrange(100)]")
    print "Implicit: %.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)

আমার কম্পিউটারে চালিত হওয়ার সাথে সাথে ফলাফলগুলি:

Explicit: 8.07 usec/pass
Implicit: 22.86 usec/pass

অন্যান্য সেট:

Explicit: 6.80 usec/pass
Implicit: 19.01 usec/pass

3
এটি আরও দ্রুত হবে বলে আশা করিনি। এমনকি আমি যখন x এর জন্য x "(= 10000000)] এর জন্য" l = [এলোমেলো.রেন্ডম () দিয়ে l কে প্রতিস্থাপন করি তখনও এটি দ্রুততর হয়, যা গ্যারান্টি দেয় যে শেষ উপাদানটি সবচেয়ে বড়।
সানি 88

14
@ সানি ৮৮: সংখ্যার একটি সাধারণ তালিকার জন্য, সহজ পদ্ধতির দ্রুততর। আপনি যদি এই ক্ষেত্রে পারফরম্যান্সের পরে থাকেন তবে আমি ব্যবহার করার পরামর্শ দেব numpy.argmax()যা আমার মেশিনে আরও 30 গুণ বেশি দ্রুত। তালিকায় যদি কেবল সংখ্যার চেয়ে আরও জটিল বিষয় থাকে তবে আমার উত্তরের পদ্ধতির দ্রুত হতে পারে। এই পদ্ধতির অন্যতর সুবিধা হ'ল এটি কেবল তালিকার জন্য নয়, স্বেচ্ছাচারী পুনরাবৃত্তির জন্য ব্যবহার করা যেতে পারে।
সোভেন মারনাচ

@ সোভেন-মার্নাচ কি অদ্ভুত দ্রুততর হবে, যদি আমি আমার তালিকাটি প্রথমে একটি অদ্ভুত অ্যারে রূপান্তর করতে পারি? সরল উদাহরণের জন্য এটি কি দ্রুত হবে [0,1,0]?
tommy.carstensen

1
@ সোভেন-মারনাচ আমি সবেমাত্র পরীক্ষা করেছি। numpy.argmax এখন পর্যন্ত সবচেয়ে ধীর পদ্ধতি এবং এটি ভুল উত্তর দেয়, যদি অ্যারেটিতে ভাসমান বা পূর্ণসংখ্যার পরিবর্তে স্ট্রিং থাকে।
tommy.carstensen

9
সর্বাধিক মানগুলি সদৃশ করা থাকলে list.index () সমস্যাযুক্ত হবে না?
লোগান ইয়াং

20

এই উত্তরটি @ এস্কুয়ালোর চেয়ে the৩ গুণ বেশি গতিযুক্ত ধরে নিয়েছে যে তালিকাটি খুব বড়, এবং ধরে নিয়েছে এটি ইতিমধ্যে একটি এনপি.আররে ()। আমাকে টেস্ট রানের সংখ্যাটি ফিরিয়ে দিতে হয়েছিল কারণ পরীক্ষাটি 100 টি নয় 10000000 উপাদানের দিকে তাকিয়ে আছে।

import random
from datetime import datetime
import operator
import numpy as np

def explicit(l):
    max_val = max(l)
    max_idx = l.index(max_val)
    return max_idx, max_val

def implicit(l):
    max_idx, max_val = max(enumerate(l), key=operator.itemgetter(1))
    return max_idx, max_val

def npmax(l):
    max_idx = np.argmax(l)
    max_val = l[max_idx]
    return (max_idx, max_val)

if __name__ == "__main__":
    from timeit import Timer

t = Timer("npmax(l)", "from __main__ import explicit, implicit, npmax; "
      "import random; import operator; import numpy as np;"
      "l = np.array([random.random() for _ in xrange(10000000)])")
print "Npmax: %.2f msec/pass" % (1000  * t.timeit(number=10)/10 )

t = Timer("explicit(l)", "from __main__ import explicit, implicit; "
      "import random; import operator;"
      "l = [random.random() for _ in xrange(10000000)]")
print "Explicit: %.2f msec/pass" % (1000  * t.timeit(number=10)/10 )

t = Timer("implicit(l)", "from __main__ import explicit, implicit; "
      "import random; import operator;"
      "l = [random.random() for _ in xrange(10000000)]")
print "Implicit: %.2f msec/pass" % (1000  * t.timeit(number=10)/10 )

আমার কম্পিউটারে ফলাফল:

Npmax: 8.78 msec/pass
Explicit: 290.01 msec/pass
Implicit: 790.27 msec/pass

কেবল স্পষ্ট করে বলার জন্য: স্পিডআপটি খালি অজগর বনাম অদ্ভুত সি প্রয়োগের কারণে? বা খাঁটি অজগর ব্যবহার করে @ এস্কুয়ালোর উত্তরের কোনও উন্নতি পাওয়ার উপায় আছে?
সর্বাধিক

যদি কেউ পাইথন ৩.6 ব্যবহার করতে চান তবে এর মতো কিছু করতে পারেন: "l = np.array ([random.random () _ ইন রেঞ্জের জন্য (10000000)])") মুদ্রণ (চ "এনপিম্যাক্স: {(1000 * টি)। সময়কাল (সংখ্যা = 10) / 10): 5.2f} এমএসসি / পাস ")
পাইওটার সিজেদা


1
ঠিক আছে, numpy.argmaxআপনি এটি একটি মানক অজগর তালিকার প্রক্রিয়া না করা অবধি গতিটি দুর্দান্ত দেখায় । তারপরে স্পিডটি স্পষ্ট এবং অন্তর্নিহিত সংস্করণের মধ্যে রয়েছে। আমি অনুমান করি np.arrayযে কেবল একটি তালিকা তৈরি করে না তবে এটি এতে কিছু অতিরিক্ত তথ্য সংরক্ষণ করে - যেমন ন্যূনতম এবং সর্বোচ্চ মান (কেবলমাত্র একটি অনুমান)।
মিরোসলা ওপোকা

17

পাইথনের অন্তর্নির্মিত লাইব্রেরি সহ এটি বেশ সহজ:

a = [2, 9, -10, 5, 18, 9] 
max(xrange(len(a)), key = lambda x: a[x])

এটি কাস্টম ফাংশনটি ব্যবহার করে maxতালিকার বৃহত্তম সংখ্যাটি সন্ধান করতে বলে, যা বলে যে প্রকৃতপক্ষে , আসলে , ইত্যাদি [0, 1, 2, ..., len(a)]usinglambda x: a[x]0219


পাইথন 3-তে কোনও এক্সরঞ্জ নেই, যদি আপনি কোডটি লিখতে চান যা পাইথন 2 এবং পাইথন 3 উভয়ের জন্য চলতে পারে তবে আপনার ব্যাপ্তি () ব্যবহার করা উচিত।
চুন্ডে হুয়াং

10
max([(v,i) for i,v in enumerate(my_list)])

এটি আরও ভাল কারণ আপনি এটি টিপল ব্যতীত অন্য কিছু ব্যবহারের সাথে মানিয়ে নিতে পারেন।
wieczorek1990

কিভাবে এই কাজ করে? আপনি কি প্রক্রিয়াটি ভেঙে ফেলতে পারেন?
ক্লাব 45

হাই @ ক্লাব 45, এটি আমার_ তালিকাকে তালিকার একটি তালিকায় রূপান্তর করে (v, i) যেখানে v আমার তালিকার প্রতিটি আইটেম এবং আমি সংবাদদাতা সূচক, তারপরে এটি সর্বাধিক মান (এবং এর সাথে সম্পর্কিত সূচী সহ) টিপল পায়
লুইস সোব্রেকিউভা 26'17

4
ধন্যবাদ, আপনি কি উত্তরটিতে পোস্ট করতে পারেন? এবং সর্বাধিক মান গণনা করার সময় maxপ্রতিটি টিপল ( v) এর প্রথম আইটেমটিকে কীভাবে বিবেচনা করতে হবে ?
clabe45

1
@ ক্লবে 45 এই উত্তরটি খুব দেরিতে আসতে পারে তবে অন্যদের জন্য (আমার মতো) যারা এখন এই থ্রেডটি পেরিয়ে এসেছেন, এখানে: stackoverflow.com/questions/18296755/… একটি ব্যাখ্যা। এই লাইনটি নয়: "ডিফল্টরূপে সর্বাধিক প্রথম সূচকগুলির সাথে আইটেমগুলির তুলনা করবে, যদি প্রথম সূচক একই হয় তবে এটি দ্বিতীয় সূচকের সাথে তুলনা করে।" সুতরাং আমি এটিকে তালিকা দিয়ে চেষ্টা করেছিলাম: l = [1,1,1] এবং তারপরে সর্বোচ্চ ([(v, i) আই, ভি ইন ইনুমারেট (এল)]) এবং এটি আমাকে প্রথম 1 নয় তবে শেষটি দেয় এক: (1,2) ফলস্বরূপ। আমি আশা করি এটি ব্যাখ্যা করেছে :)
অনুপম জৈন

10

আমি খুব সহজ উপায় প্রস্তাব করব:

import numpy as np
l = [10, 22, 8, 8, 11]
print(np.argmax(l))
print(np.argmin(l))

আশা করি এটা সাহায্য করবে.


4
max([(value,index) for index,value in enumerate(your_list)]) #if maximum value is present more than once in your list then this will return index of the last occurrence

যদি বর্তমানের সর্বাধিক মান একাধিকবার হয় এবং আপনি সমস্ত সূচক পেতে চান,

max_value = max(your_list)
maxIndexList = [index for index,value in enumerate(your_list) if value==max(your_list)]

1
হা. আমি প্রায় একটি উত্তর পোস্ট করেছি, কিন্তু তারপরে আমি দেখেছি আপনার তালিকা সমীকরণ ওয়ান-লাইনারে একই যুক্তির সাথে ইতিমধ্যে আপনার একই সমাধান রয়েছে।
ওয়ালিকু

2

হতে পারে আপনার যেভাবেই বাছাই করা তালিকার দরকার আছে?

এটা চেষ্টা কর:

your_list = [13, 352, 2553, 0.5, 89, 0.4]
sorted_list = sorted(your_list)
index_of_higher_value = your_list.index(sorted_list[-1])

1. বাছাইয়ের সময় বেশি জটিলতা রয়েছে। ২. sorted_listইনডেক্স তবে মান নেই, সুতরাং এটি কাজ করবে না।

1

এই থ্রেডটি পুনরুদ্ধারের জন্য দুঃখিত, তবে আমার পদ্ধতিটি যুক্ত করার মতো বলে মনে হয়েছিল।

এই উদাহরণে তালিকার নাম 'তালিকা'

list.sort()
print(list[-1])

যে তালিকা হিসাবে সর্বোচ্চ মান মুদ্রণ করবে!

list.sort()ASCII টেবিলের আইটেমের মান অনুসারে তালিকাটি সাজান , তাই কার্যকরভাবে তালিকাটি সর্বনিম্ন থেকে সর্বোচ্চকে সাজান। আমি তখন মাত্র ব্যবহার করে তালিকার শেষ মান (যা সর্বাধিক সংখ্যা হবে) প্রিন্ট print(list[-1])

আশাকরি এটা সাহায্য করবে!


5
আমরা এইভাবে সূচকটি পেতে পারি না
টয়িং_ও করা হচ্ছে

-1

পাইথনের অন্তর্নির্মিত ফাংশনগুলি ব্যবহার করে আপনার প্রশ্নের এখানে একটি সম্পূর্ণ সমাধান:

# Create the List
numbers = input("Enter the elements of the list. Separate each value with a comma. Do not put a comma at the end.\n").split(",") 

# Convert the elements in the list (treated as strings) to integers
numberL = [int(element) for element in numbers] 

# Loop through the list with a for-loop

for elements in numberL:
    maxEle = max(numberL)
    indexMax = numberL.index(maxEle)

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