python - معني - ما هو الحد الأقصى الذي تختاره بايثون في حالة التعادل؟




معني python (4)

عند استخدام الدالة max() في Python للعثور على الحد الأقصى للقيمة في قائمة (أو tuple ، dict إلخ.) ، وهناك تعادل للقيمة القصوى ، ما هي وظيفة بيثون بيك؟ هل هو عشوائي؟

يكون هذا الأمر ذا صلة إذا كان لدى الفرد ، على سبيل المثال ، قائمة بالصفوف ، بينما يقوم أحدهما بتحديد الحد الأقصى (باستخدام key= ) استنادًا إلى العنصر الأول من المجموعة ولكن هناك عناصر ثانية مختلفة. كيف تختار بايثون أي واحد تختاره كحد أقصى؟

أنا أعمل في Python v2.6.


بالنسبة إلى إصدارات Python 2 ، IMO ، أعتقد أنه لا يمكنك افتراض أن max() يعرض العنصر الأقصى الأول في القائمة في حالة الروابط. لدي هذا الاعتقاد لأنه من المفترض أن يقوم max() بتنفيذ max دالة حسابية حقيقية ، والتي تستخدم في مجموعات ذات ترتيب إجمالي ، وحيث لا تحتوي العناصر على "معلومات مخفية".

(سأفترض أن الآخرين قد بحثوا بشكل صحيح وأن وثائق بايثون لا تعطي أي ضمانات max() .

(بشكل عام ، هناك عدد لا نهاية له من الأسئلة التي يمكنك طرحها حول سلوك وظيفة المكتبة ، ولا يمكن الإجابة على معظمها تقريبًا. على سبيل المثال: ما هي مساحة المكدس max() سيستخدمها max() ؟ كم هي الذاكرة المؤقتة ، هل يمكن أن تقارن نفس الزوج من الأجسام أكثر من مرة (إذا كانت المقارنة لها أثر جانبي)؟ هل يمكن تشغيلها أسرع من زمن O (n) لهياكل البيانات المعروفة "الخاصة" وما إلى ذلك.


بالنسبة لبيثون 3 ، لم يعد سلوك max() في حالة العلاقات مجرد تفاصيل تنفيذ كما هو مفصل في الإجابات الأخرى. هذه الميزة مضمونة الآن ، كما تنص وثائق Python 3 بوضوح:

إذا كانت العناصر المتعددة هي الحد الأقصى ، تقوم الدالة بإرجاع أول عنصر تمت مواجهته. ويتسق هذا مع أدوات أخرى للحفاظ على استقرار النوع مثل الفرز (iterable، key = keyfunc، reverse = True) [0] و heapq.nlargest (1، iterable، key = keyfunc).


في Python 2 ، لم يتم تحديد ذلك في الوثائق ولا يوجد في قسم Python المحمول في المكتبة القياسية ، لذلك قد يختلف هذا السلوك بين عمليات التنفيذ.

في المصدر إلى CPython 2.7 يتم تنفيذ هذا في ./Python/bltinmodule.c by builtin_max [ source ] ، والذي يلف الدالة min_max الأكثر عمومية [ source ] .

سيعمل min_max التكرار من خلال القيم واستخدام PyObject_RichCompareBool [ docs ] لمعرفة ما إذا كانت أكبر من القيمة الحالية. إذا كان الأمر كذلك ، فإن القيمة الأكبر تحل محلها. سيتم تخطي القيم المتساوية.

والنتيجة هي أن الحد الأقصى الأول سيتم اختياره في حالة التعادل.


من الاختبار التجريبي ، يبدو أن 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')

ويؤكد جيريمي التجريب الممتاز أن هذا هو الحال بالفعل.





max