2012-06-28 16 views
15

कहें कि मेरे पास संख्याओं की एक सूची है [ 20, 15, 27, 30 ]सूची में सबसे छोटी संख्या का सूचकांक मूल्य ढूँढना?

मैं इस सूची में सबसे कम मूल्य की अनुक्रमणिका संख्या कैसे वापस करूँगा। (15) जाहिर है, न्यूनतम (एलएसटी) खुद को सबसे छोटा नंबर वापस कर देगा, लेकिन इसके बजाय मैं इसके सूचकांक "1" कैसे लौटा सकता हूं?

उत्तर

33

चूंकि आप पहले ही जानते हैं कि न्यूनतम मूल्य कैसे प्राप्त करें, आप सूची में इस मान की अनुक्रमणिका प्राप्त करने के लिए index() फ़ंक्शन पर उस मान को फ़ीड करते हैं। यानी,

n = [20, 15, 27, 30] 
n.index(min(n)) 

पैदावार

1 

इस सूची से न्यूनतम मान के सूचकांक वापस आ जाएगी। ध्यान दें कि यदि कई मिनीमा हैं तो यह पहले वापस कर देगा।

min(): एक ही तर्क के साथ, एक गैर-खाली पुनरावर्तनीय (जैसे स्ट्रिंग, टुपल या सूची) की सबसे छोटी वस्तु को वापस करें। एक से अधिक तर्क के साथ, तर्कों में से सबसे छोटे लौटें।

list.index(x): पहले आइटम जिसकी मान x है की सूची में सूचकांक लौटें। कोई त्रुटि नहीं है तो कोई त्रुटि है।

7

एक और डेटा की जटिलता के आधार विकल्प:

import heapq 
s = [20, 15, 27, 30] 
heapq.nsmallest(1, ((k, i) for i, k in enumerate(s))) 
+1

यह वह जगह है (संभावना) तेजी से सामान्य रूप में, क्योंकि सबसे अच्छा ज्ञात सबसे खराब स्थिति जटिलता एक ढेर के निर्माण के लिए बाध्य हे (एन) है, जबकि इसकी तुलना प्रकारों में ओ (नलॉग (एन)) सबसे खराब मामला है। हालांकि, यह सुनिश्चित करने के लिए कि इन डेटा संरचनाओं के पाइथन कार्यान्वयन सर्वोत्तम केस सीमाओं के अनुरूप हैं, दो कार्यान्वयनों को प्रोफाइल करना अभी भी अच्छा होगा। – mvanveen

+0

मुझे यह पसंद है क्योंकि यह एक पुनरावर्तक पर काम करेगा। – steveha

10
>>> L = [20, 15, 27, 30] 
>>> min(range(len(L)), key=L.__getitem__) 
1 
5

यह @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]) 
+0

और निश्चित रूप से, 'itemgetter' (कम से कम CPython) का उपयोग करके पाइथन से और सी स्तर में कोड का निष्पादन होता है। –

+0

@ जोन क्लेमेंट्स, मुझे आश्चर्य है कि अगर आपके उत्तर में किया गया था, तो उलटा क्रम में बस tuples बनाने के लिए तेज़ होगा। – steveha

+2

मुझे संदेह है कि प्रदर्शन एक बोतल-गर्दन काफी अलग होना चाहिए - हालांकि मुझे पहले ठीक किया गया है। 1 महीने से थोड़ा सा कोड लेना 3 दिनों तक निष्पादित करना - मैं खुश हूं। 2mins54s से 2mins30 तक जाने वाली बिट के बारे में परेशान करना - मुझे परेशान नहीं किया जा सकता - मैं अस्पताल सिस्टम का संचालन नहीं कर रहा हूं, और मैं भी आईओ बाध्य हूं, इसलिए :) –

संबंधित मुद्दे