एल्गोरिदम (पायथन): के से सबसे छोटी संख्या पाएं

मेरे पास एल्गोरिदम दृष्टिकोण से एक प्रश्न है। मेरे पास संख्याओं की एक सूची है (फ्लोट्स)

1.22,3.2, 4.9,12.3.....and so on

और मैं सबसे छोटा नंबर (कहने देता हूं) 4 से अधिक खोजना चाहता हूं .. तो जवाब 4.9 है लेकिन स्पष्ट समाधान के अलावा .. (सूची के माध्यम से पुन: प्रयास करना और के से छोटे से छोटे नंबर का ट्रैक रखना) ऐसा करने के लिए "पायथन तरीका" क्या है। धन्यवाद

7

4 उत्तर

min(x for x in my_list if x > 4)
15
जोड़ा
@ अंबर: ठीक है, आपको और क्या करना चाहिए? :)
जोड़ा लेखक Sven Marnach, स्रोत
अनुमोदित, यह वही करता है जो आपने ओपी में कहा था ("के माध्यम से सबसे छोटी संख्या के ट्रैक रखने के लिए सूची के माध्यम से पुनरावृत्ति करें) - यह सिर्फ इसे लिखने का एक कॉम्पैक्ट तरीका है।
जोड़ा लेखक Amber, स्रोत
@ स्वेनमार्कैच - मैं यह नहीं कह रहा था कि आपके उत्तर में कुछ भी गलत था (सचमुच कुछ भी बेहतर नहीं है जो आप कर सकते हैं); सिर्फ पूछताछकर्ता को इंगित करते हुए कि यह सिर्फ वाक्य रचनात्मक चीनी है, ऐसा कुछ नहीं जो जादुई रूप से पुनरावृत्ति से अधिक कुशल है।
जोड़ा लेखक Amber, स्रोत
मैं बस एक ही सवाल था। स्वीकार्य उत्तर को पढ़ना थोड़े मुझे निराश करता है - जो कहीं और खोदना चाहता है - और फिर मैंने इसे देखा। सिंटेक्टिक चीनी या नहीं, यह अभी भी मीठा है।
जोड़ा लेखक Noich, स्रोत

बाइनरी खोज इस से निपटने का एक मानक तरीका होगा, लेकिन केवल तभी सूची को सॉर्ट किया गया है, जैसा कि पिछले उत्तर ने बताया था।

See Python binary search-like function to find first number in sorted list greater than a specific value

and In Python, how do you find the index of the first value greater than a threshold in a sorted list?

for discussion of a module that does this for you: http://docs.python.org/library/bisect.html

8
जोड़ा
बिसेक्ट फ़ंक्शन के लिए +1
जोड़ा लेखक joaquin, स्रोत

यह फ़िल्टर के लिए एक आदर्श परिदृश्य है।

>>> L = [1.22, 3.2, 4.9, 12.3]
>>> k = 4
>>> a = min(filter(lambda x: x > k, L))
>>> print(a)
4.9

आप सूची समझ का भी उपयोग कर सकते हैं:

>>> L = [1.22, 3.2, 4.9, 12.3]
>>> k = 4
>>> a = min([element for element in L if element > k])
>>> print(a)
4.9

यद्यपि सूची की समझ पहले दृश्य पर कम सीधी-आगे प्रतीत होती है, लेकिन इसे करने का अनुशंसित तरीका है। कुछ पायथन डेवलपर्स के अनुसार, फ़िल्टर का उपयोग नहीं किया जाना चाहिए।

एक जनरेटर अभिव्यक्ति और भी बेहतर है क्योंकि यह सूची नहीं बनाता है याद:

>>> L = [1.22, 3.2, 4.9, 12.3]
>>> k = 4
>>> a = min(element for element in L if element > k)
>>> print(a)
4.9
5
जोड़ा

मुझे अजगर के बारे में कोई जानकारी नहीं है, लेकिन एक एल्गोरिदमिक दृष्टिकोण से शायद मैं कुछ जोड़ सकता हूं। आपके उदाहरण में आपकी सूची एकान्त रूप से बढ़ रही है (क्रमबद्ध)। यदि यह हमेशा आपकी सूची के बारे में सच है, तो एक बार 4 से बड़े नंबर पर पहुंचने के बाद एक छोटा ऑप्टिमाइज़ेशन फिर से शुरू हो सकता है।

यदि आपकी सूची में हमेशा 4 से कम संख्याएं हैं, तो यह एक अच्छा अनुकूलन होगा, लेकिन यदि लक्ष्य संख्या से पहले और बाद में आइटम की संख्या यादृच्छिक है, तो यह सुधार विश्वसनीय नहीं है।

उस स्थिति में, आप विभाजन को विभाजित करके सूची खोजना चाहेंगे। परीक्षण करें कि मध्यम तत्व 4 से बड़ा है। यदि यह बड़ा है, तो ऊपरी आधा दूर फेंक दें, अन्यथा निचले आधे भाग को फेंक दें। नई आधा लंबाई सूची पर वही काम करें। आपको सूची और सेगमेंट में केवल 1 या 2 आइटम शेष होने पर भी और विषम संख्याओं से निपटने की आवश्यकता है। एक बड़ी सूची के लिए, यह परीक्षणों की संख्या को काफी कम करना चाहिए।

2
जोड़ा