यह @Jon क्लेमेंट्स के जवाब के समान है। उनका उपयोग heapq
है जिसका अर्थ है कि इसका उपयोग एक से अधिक छोटे मूल्यों को खोजने के लिए किया जा सकता है। itemgetter()
का उपयोग करने के बजाय वह बस tuples में मानों के क्रम को उलट देता है ताकि वे स्वाभाविक रूप से सही क्रम में सॉर्ट कर सकें।
तो आप सभी की जरूरत ही सबसे छोटा मान है, यह एक आसान तरीका है:
from operator import itemgetter
lst = [20, 15, 27, 30]
i, value = min(enumerate(lst), key=itemgetter(1))
enumerate()
अजगर में हमेशा की तरह एक सूची और उनके सूचकांक से मूल्यों जोड़ी है, यह एक पुनरावर्तक देता है जो (i, value)
जैसे tuples उत्पन्न करता है जहां value
मूल अनुक्रम से एक मान है और i
अनुक्रम के भीतर उस मान का सूचकांक है। min()
एक पुनरावर्तक ले सकता है; key=
तर्क एक फ़ंक्शन पर सेट किया गया है जो युग्मित सूचकांक मान को अनदेखा करता है और प्रत्येक टुपल के भीतर न्यूनतम न्यूनतम मान (अनुक्रमणिका 1) पाता है।
min()
यह न्यूनतम मान के साथ पाउपल लौटाता है और फिर हम i
और value
पर मान निर्दिष्ट करने के लिए टुपल अनपॅकिंग का उपयोग करते हैं।
उदाहरण दिखाया गया एक सूची है, लेकिन यह एक इटरेटर सहित किसी भी अनुक्रम के साथ काम करेगा:
from random import randint
def rseq(n=20):
for i in xrange(n):
yield randint(0, 101)
i, value = min(enumerate(rseq()), key=itemgetter(1))
ध्यान दें कि itemgetter(n)
एक कारखाने कि प्रतिदेय वस्तुओं बनाता है। itemgetter(1)
के साथ आपको एक कॉल करने योग्य मिलता है जो अनुक्रम में दूसरी वस्तु (अनुक्रमणिका 1) देता है (इस मामले में, एक ट्यूपल)।तुम भी एक समारोह या एक ही बात करने के लिए एक lambda
समारोह लिख सकते हैं:
def get1(x):
return x[1]
i, value = min(enumerate(lst), key=get1)
i, value = min(enumerate(lst), key=lambda x: x[1])
यह वह जगह है (संभावना) तेजी से सामान्य रूप में, क्योंकि सबसे अच्छा ज्ञात सबसे खराब स्थिति जटिलता एक ढेर के निर्माण के लिए बाध्य हे (एन) है, जबकि इसकी तुलना प्रकारों में ओ (नलॉग (एन)) सबसे खराब मामला है। हालांकि, यह सुनिश्चित करने के लिए कि इन डेटा संरचनाओं के पाइथन कार्यान्वयन सर्वोत्तम केस सीमाओं के अनुरूप हैं, दो कार्यान्वयनों को प्रोफाइल करना अभी भी अच्छा होगा। – mvanveen
मुझे यह पसंद है क्योंकि यह एक पुनरावर्तक पर काम करेगा। – steveha