2015-01-15 11 views
10

मैं एक सरणी में सबसे कम सकारात्मक मूल्य और सूची में अपनी स्थिति को खोजने के लिए देख रहा हूँ। यदि सूची में कोई मान डुप्लिकेट किया गया है, तो केवल पहला उदाहरण ब्याज का है। 2, मान:: यह है कि मैं क्या जो करता है जो मैं चाहता है,सरणी में न्यूनतम मान खोजें> 0

myArray = [4, 8, 0, 1, 5]

तो स्थिति है, लेकिन 0.

print "Position:", myArray.index(min(myArray)) 
print "Value:", min(myArray) 
उदाहरण के लिए

भी शामिल है, के रूप में यह है, तो खड़ा 0

मैं इसे स्थिति प्रस्तुत करना चाहता हूं: 3, मान: 1

+0

क्या आप अपने सरणी में डुप्लिकेट मान प्राप्त कर सकते हैं? यदि हां, तो क्या आप केवल पहले उदाहरण की स्थिति में रुचि रखते हैं? –

+0

डुप्लिकेट बहुत संभव हैं, और हां पहला उदाहरण ब्याज की बात है, इसे इंगित करने के लिए धन्यवाद, प्रश्न – user3001499

+1

में संशोधन करेगा मैं समस्या विवरण से उलझन में हूं: यह कहता है 'मैं एक सरणी में न्यूनतम मान ढूंढ रहा हूं 0 से अधिक है और इसकी इसी स्थिति 'जो मुझे कार्य की तरह पढ़ती है वह शून्य से अधिक और उसके संबंधित स्थिति से अधिक का सबसे छोटा मान ढूंढना है। मुझे लगता है कि वास्तव में इसका मतलब है कि सबसे छोटा मूल्य (और इसकी स्थिति) जो शून्य से अधिक है ... –

उत्तर

24

आप min के साथ generator expression का उपयोग कर सकते हैं। यह m को a में न्यूनतम मान के रूप में सेट करेगा जो कि 0 से अधिक है। यह list.index का उपयोग करता है ताकि यह मान पहली बार प्रदर्शित हो सके।

a = [4, 8, 0, 1, 5] 

m = min(i for i in a if i > 0) 

print("Position:", a.index(m)) 
print("Value:", m) 
# Position: 3 
# Value: 1 
+0

@ user3001499 मैं आपके प्रश्न में शब्दों से उलझन में था और अब मेरी भ्रम की व्याख्या करने के लिए एक टिप्पणी जोड़ा। –

+0

सबसे खराब मामले में इस समाधान को 'ए' को दो बार घुमाने की आवश्यकता होती है (यदि सूची का अंत सबसे छोटा मूल्य है)। –

+0

हाँ, ईमानदारी से अगर मैं स्वीकार कर रहा था तो मैं नीचे दिए गए फोरथी के जवाब को स्वीकार करूंगा (यही कारण है कि मैंने इसे ऊपर उठाया)। @ user3001499 मैं सुझाव दूंगा कि आप thefourtheye के समाधान के साथ जाएं (और यदि आप मुझे उसके लिए अस्वीकार करते हैं तो बुरा नहीं लगेगा :)) – Ffisegydd

1

तो एक फ़िल्टर जोड़ें:

myArray = [4, 8, 0, 1, 5] 
result = min(filter(lambda x: x > 0, myArray)) 
print result # 1 
print myArray.index(result) # 3 
+2

का उपयोग करूँगा जो केवल निम्नतम मूल्य प्रदान करता है; यह सरणी में स्थिति नहीं देता है। –

1
def find_min_position(array): 
    plus_array = [elem for elem in array if elem > 0] 
    min_elem = min(plus_array) 
    return min_elem, array.index(min_elem) 

In : find_min_position([4, 8, 0, 1, 5]) 
Out: (1, 3) 
8

आप इस

result = min(enumerate(a), key=lambda x: x[1] if x[1] > 0 else float('inf')) 
print("Position : {}, Value : {}".format(*result) 
# Position : 3, Value : 1 

यह सुनिश्चित करें कि, मूल्य है अगर बनाता है की तरह, min समारोह और enumerate समारोह का उपयोग कर सकते 0 से अधिक, फिर न्यूनतम मान तुलना के लिए उस मान का उपयोग करें बुद्धिमान अधिकतम संभव मूल्य का उपयोग करें (float('inf'))।

चूंकि हम वस्तुओं की वास्तविक अनुक्रमणिका के साथ पुन: प्रयास करते हैं, इसलिए हमें किसी अन्य लूप के साथ वास्तविक अनुक्रमणिका नहीं मिलनी है।

+2

पहली बार मैं इस तरह से गणना का उपयोग कर देखता हूं, महान संकेत! – markcial

+0

इसे ऊपर उठाना क्योंकि यह 'एन्युमरेट' का उपयोग करने वाला पहला व्यक्ति है (जो दो बार ट्रैवर्सिंग से बचाता है)। –

+0

न्यूनतम फ़ंक्शन में कुंजी पैरामीटर का उपयोग करने के लिए उपरोक्त - जनरेटर के माध्यम से लूपिंग के बजाय। – neil

4

यहां जनरेटर अभिव्यक्ति के साथ ऐसा करने का एक और तरीका है। ध्यान दें कि अंकुरित (ए और बी) से आने वाले मान सही तरीके से क्रमबद्ध करने के लिए टुपल में कैसे बदल दिए जाते हैं।

value,position = min(((b,a) for a,b in enumerate(myArray) if b>0), default=(None,None)) 

जेनरेटर अभिव्यक्ति कुछ भी नहीं लौटाता है (यानी 0 से अधिक कोई आइटम नहीं है) डिफ़ॉल्ट तर्क वापस लौटाया जाएगा। डिफ़ॉल्ट जो कुछ आसपास के कार्यक्रम तर्क में समझ में आता है करने के लिए सेट किया जा सकता है - यहाँ लौटने None आप या तो if value: या if position:

+1

यह स्वीकार किया जाना चाहिए, यह अन्य उत्तरों की तुलना में अधिक पाइथोनिक और तेज है। – Jae

+0

यह अच्छा होगा अगर यह उन मामलों को सहन कर सके जहां कोई मूल्य नहीं है> 0। –

+1

@EL_DON - इसके बारे में कैसे? मैंने 'min' को डिफ़ॉल्ट तर्क देने से पहले कई क्लंकियर विधियों का प्रयास किया था। – neil

0
import numpy as np 

x = np.array([1,2,0,5,10]) 
x = np.extract(x>0,x) 
min_index = np.amin(x) 
min_value = np.argmin(x) 
0

जटिल/एल्गोरिथम तरीके के साथ परीक्षण करने के लिए अनुमति देगा:

int min = array[0], i = 1 
list smallest //list of indexes of the smallest element 

// find the first element greater than 0 
while (min <= 0 and i < array.length) { 
    min = array[i] 
    i++ 
} 

// find the first instance of the smallest element greater than 0 
while (i < array.length) { 
    if (array[i] < min and array[i] > 0) { 
     clear the list 
     min = array[i] 
     list.append(i) 
    } 
    else if (array[i] == min) { 
     list.append(i) 
    } 
    i++; 
} 

पहले 0 से अधिक छोटे तत्व का उदाहरण अब पहला तत्व है जिसे आपने सूची में जोड़ा है।

संपादित करें: आपके पास सबसे छोटे मूल्य की प्रत्येक अनुक्रमणिका की एक सूची भी होगी। कुछ सरल चेक आपको बता सकते हैं कि 0 से अधिक सरणी में कोई तत्व नहीं है, या यदि सूची खाली है, आदि

+0

में जोड़ा गया था, मैं कहूंगा कि इसका उपयोग करने के बजाय, विशेष रूप से इस स्थिति में उपयोग करने से अधिक पायथनिक है। इसके अलावा यदि आपको इंडेक्स और वैल्यू की ज़रूरत है, तो गणना करने का तरीका है, जैसा कि thefourtheye उत्तर – bwagner

+0

पर ध्यान दिया गया है, मैं उत्तर को इस तरह से छोड़ दूंगा। इस मामले में रुचि रखने वाले किसी भी व्यक्ति के लिए, इसे देखें: http://stackoverflow.com/questions/920645/when-to-use-while-or-the-for-in-python – JHaps

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