2011-07-21 6 views
58

पाइथन में max() फ़ंक्शन का उपयोग किसी सूची में अधिकतम मूल्य (या टुपल, डॉट इत्यादि) खोजने के लिए करते हैं और अधिकतम मूल्य के लिए एक टाई होती है, जिसे कोई पाइथन चुनता है? क्या यह यादृच्छिक है?टाई के मामले में पाइथन कौन सा अधिकतम चुनता है?

यह प्रासंगिक है, उदाहरण के लिए, किसी के पास टुपल्स की एक सूची है और एक टुपल के पहले तत्व के आधार पर अधिकतम (key= का उपयोग करके) का चयन करता है लेकिन अलग-अलग दूसरे तत्व होते हैं। पाइथन कैसे चुनता है कि अधिकतम को किसके रूप में चुनना है?

मैं पाइथन v2.6 में काम कर रहा हूं।

+6

बस किसी भी सॉर्टिंग फ़ंक्शन के लिए इस पर भरोसा करने की कोशिश न करें। – hugomg

+1

http://stackoverflow.com/questions/4237914/python-max-min-builtin-functions- निर्भर-on-parameter-order – agf

+2

का उत्तर देखें, मैं लापता होने के साथ सहमत हूं कि यह व्यवहार नहीं है जिस पर आपको भरोसा करना चाहिए। मुझे उम्मीद है कि आप सिर्फ डीबगिंग उद्देश्यों के लिए पूछ रहे हैं। यदि आप ट्यूपल के दूसरे तत्व (आपके काल्पनिक उदाहरण में) की परवाह करते हैं तो आपको हमेशा इसे अपने कुंजी = फ़ंक्शन में देखना चाहिए। – codewarrior

उत्तर

62

पायथन 2 पर, यह दस्तावेज़ीकरण में निर्दिष्ट नहीं है और मानक पुस्तकालय के पोर्टेबल इन-पायथन खंड में नहीं है, इसलिए यह व्यवहार कार्यान्वयन के बीच भिन्न हो सकता है।

CPython 2.7 इस ./Python/bltinmodule.c में कार्यान्वित किया जाता करने के लिए स्रोत में builtin_max[source] है, जो अधिक सामान्य min_max समारोह [source] लपेटता द्वारा।

min_max मूल्यों के माध्यम से पुनरावृति और PyObject_RichCompareBool[docs] का उपयोग करता है, तो वे वर्तमान मूल्य से अधिक कर रहे हैं देखने के लिए होगा। यदि ऐसा है, तो अधिक मूल्य इसे बदल देता है। समान मूल्यों को छोड़ दिया जाएगा।

परिणाम यह है कि टाई के मामले में पहला अधिकतम चुना जाएगा।

+8

मुझे लगता है कि इसका मतलब एक शब्दकोश के लिए है, यह वास्तव में अस्पष्ट है क्योंकि यह इसलिए है क्योंकि तत्वों का आदेश नहीं दिया जाता है। एक बार फिर धन्यवाद। –

+0

@DoubleAA हाँ, शब्दकोशों के साथ तुलना एक ही तर्क का पालन नहीं करती है, मुझे आश्चर्य है कि पायथन आपको उसी ऑपरेटरों का उपयोग करने देता है। ऐसा लगता है कि यह सिर्फ बग बनाने के लिए कह रहा है ... –

+0

+1 अच्छा जवाब के लिए। –

18

अनुभवजन्य परीक्षण से, ऐसा लगता है कि max() और min() एक सूची पर सूची है कि टाई होने की स्थिति में max()/min() मैचों में पहले वापस आ जाएगी:

>>> test = [(1, "a"), (1, "b"), (2, "c"), (2, "d")] 
>>> max(test, key=lambda x: x[0]) 
(2, 'c') 
>>> test = [(1, "a"), (1, "b"), (2, "d"), (2, "c")] 
>>> max(test, key=lambda x: x[0]) 
(2, 'd') 
>>> min(test, key=lambda x: x[0]) 
(1, 'a') 
>>> test = [(1, "b"), (1, "a"), (2, "d"), (2, "c")] 
>>> min(test, key=lambda x: x[0]) 
(1, 'b') 

और Jeremy's excellent sleuthing पुष्टि की है कि यह है वास्तव में मामला।

+1

लेकिन क्या मुझे गारंटी है कि मुझे आश्चर्य है? –

+0

@ मार्क हाँ, मुझे यकीन नहीं है, यह अंतर्ज्ञानी समझ में आता है, लेकिन मैं अभी भी स्रोत/दस्तावेज़ –

+1

में पुष्टि ढूंढने की कोशिश कर रहा हूं http://stackoverflow.com/questions/4237914/python-max-min- बिल्टिन-फ़ंक्शंस-ऑन-पैरामीटर-ऑर्डर, हां। – agf

6

आपका प्रश्न कुछ हद तक एक नोट की ओर जाता है। डेटा संरचना को सॉर्ट करते समय, अक्सर ऑब्जेक्ट्स के सापेक्ष क्रम को रखने की इच्छा होती है जिसे तुलना के प्रयोजनों के बराबर माना जाता है। इसे stable sort के रूप में जाना जाएगा।

यदि आपको बिल्कुल इस सुविधा की आवश्यकता है, तो आप sort() कर सकते हैं, जो will be stable और फिर मूल सूची के सापेक्ष ऑर्डर का ज्ञान है।

पाइथन के अनुसार, मुझे विश्वास नहीं है कि आपको max() पर कॉल करने पर आपको कौन सा तत्व मिलेगा, इसकी कोई गारंटी प्राप्त होगी। अन्य उत्तर cpython उत्तर दे रहे हैं, लेकिन अन्य कार्यान्वयन (IronPython, Jython) अलग-अलग काम कर सकता है।

2

पायथन 2 संस्करणों के लिए, आईएमओ, मुझे विश्वास है कि आप यह नहीं मान सकते कि max() संबंधों के मामले में सूची में पहला अधिकतम तत्व लौटाता है। मेरे पास यह विश्वास है क्योंकि max() को वास्तविक गणितीय फ़ंक्शन max लागू करने के लिए माना जाता है, जिसका उपयोग कुल क्रम में सेट पर किया जाता है, और जहां तत्वों की कोई "छिपी हुई जानकारी" नहीं होती है।

(मुझे लगता है कि दूसरों ने सही ढंग से शोध किया है और पायथन दस्तावेज max() के लिए कोई गारंटी नहीं देता है।)

(सामान्य तौर पर, वहाँ एक अंतहीन सवालों का आप किसी लाइब्रेरी समारोह के व्यवहार के बारे में पूछ सकते हैं, और लगभग सभी उनमें से जवाब नहीं किया जा सकता उदाहरण के लिए नंबर हैं:। कितना ढेर स्थान खाली नहीं होगा max() उपयोग क्या यह एसएसई का उपयोग करेगा? कितनी अस्थायी मेमोरी? क्या यह एक ही जोड़ी की तुलना एक से अधिक वस्तुओं की तुलना कर सकती है (अगर तुलना का दुष्प्रभाव होता है)? क्या यह "विशेष" ज्ञात डेटा संरचनाओं के लिए ओ (एन) समय से तेज़ी से चल सकता है? आदि इत्यादि)

9

पाइथन 3 के लिए, संबंधों के मामले में max() का व्यवहार अब अन्य उत्तरों में विस्तृत रूप से एक कार्यान्वयन विवरण नहीं है। सुविधा अब, की गारंटी है Python 3 docs स्पष्ट रूप से राज्य के रूप में:

से अधिक आइटम अधिक से अधिक कर रहे हैं, समारोह पहले एक का सामना करना पड़ा देता है। यह जैसे सॉर्ट किए गए (इटेरिएबल, की = कीफनक, रिवर्स = ट्रू) [0] और heapq.nlargest (1, iterable, key = keyfunc) जैसे अन्य सॉर्ट-स्टेबिलिटी के साथ संगत है।

+0

क्रिस मुझे लगता है कि मेटा पर मेरा प्रश्न आपको कुछ अच्छी तरह से योग्य अपवॉट प्राप्त करता है :) https://meta.stackoverflow.com/questions/352439/should-we-add-more-explanations-when-closing-as-duplicates –

+0

@ जीन-फ्रैंकोइसफैबर धन्यवाद, अच्छी तरह से आप केवल इस मामले के लिए ही नहीं बल्कि अन्य प्रश्नोत्तर भी एक महत्वपूर्ण बिंदु उठाते हैं! –

+0

क्या पहले व्यक्ति की बजाय किसी को सामना करने का कोई तरीका है (सॉर्ट करने का सहारा लेने के बिना)? – lifebalance

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