পাইথনের বাছাই করা () ফাংশনটি কি স্থিতিশীল হওয়ার গ্যারান্টিযুক্ত?


100

ডকুমেন্টেশন যে নিশ্চয়তা দেয় না। এটির দলিলযুক্ত অন্য কোনও জায়গা আছে কি?

আমি অনুমান করছি যে এটি স্থিতিশীল হতে পারে যেহেতু তালিকাগুলিতে বাছাইয়ের পদ্ধতিটি স্থিতিশীল হওয়ার গ্যারান্টিযুক্ত (নোটস 9 ম পয়েন্ট: "পাইথন ২.৩ দিয়ে শুরু করা, সাজানো () পদ্ধতিটি স্থিতিশীল হওয়ার গ্যারান্টিযুক্ত"), এবং সাজানো কার্যকরীভাবে অনুরূপ। যাইহোক, আমি এমন কোনও নির্দিষ্ট উত্স খুঁজে পেতে সক্ষম নই যে এটি বলে।

উদ্দেশ্য: আমার প্রাথমিক কী এবং দু'টি রেকর্ডে প্রাথমিক কী সমান হয় এমন ক্ষেত্রে একটি মাধ্যমিক কী এর উপর ভিত্তি করে আমার বাছাই করতে হবে। যদি বাছাই করা () স্থিতিশীল হওয়ার গ্যারান্টিযুক্ত থাকে তবে আমি গৌণ কীটি বাছাই করতে পারি, তারপরে প্রাথমিক কীটি বাছাই করে আমার প্রয়োজনীয় ফলাফলটি পেতে পারি।

পিএস: যে কোনও বিভ্রান্তি এড়াতে, আমি "এক ধরণের স্থিতিশীল স্থিতিশীল" অর্থে স্থিতিশীল ব্যবহার করছি যদি এটি সমান তুলনা করে এমন উপাদানগুলির আপেক্ষিক ক্রমটি পরিবর্তন না করার গ্যারান্টি দেয় "।

উত্তর:


130

হ্যাঁ, ম্যানুয়ালটির উদ্দেশ্যটি নিশ্চয়ই গ্যারান্টি দেয় এটি sortedস্থিতিশীল এবং প্রকৃতপক্ষে এটি sortপদ্ধতিটির মতো একই অ্যালগরিদম ব্যবহার করে। আমি বুঝতে পারি যে ডক্স এই পরিচয়টি সম্পর্কে 100% পরিষ্কার নয়; ডক প্যাচগুলি সর্বদা আনন্দের সাথে গৃহীত হয়!


4
আমি খুঁজে পেয়েছি যে যদি আমি টিপলস বা তালিকাগুলি বাছাই করি, যখনই "প্রাথমিক" বাছাই কীগুলি সমান হয়, এটি "গৌণ" কী দ্বারা বাছাই করা শেষ হয়। উদাহরণস্বরূপ, একই ক্রম / ক্রমে মূল ইনপুট sorted([(1, 2), (1, 1)])ফেরত [(1, 1), (1, 2)]না দিয়ে ফিরে আসে । স্থিতিশীলতার গ্যারান্টিটির অর্থ এটি হওয়া উচিত নয় যে এটি আসল [(1, 2), (1, 1)]ইনপুটটি ফেরত আসবে ? sorted([(1, 2), (1, 1)], key=lambda t: t[0])
সেক্ষেত্রে

10
এক্ষেত্রে যা প্রত্যাশা করা হয় তা কি তাই নয়? পাইথন কেবলমাত্র প্রথম "প্রাথমিক" নয়, ডিফল্টরূপে সমস্ত উপাদানগুলির সাথে তুলনা করতে চলেছে। আপনি যদি কেবলমাত্র প্রথম উপাদানটি বাছাই করতে চান তবে আপনি keyপরিষ্কারভাবে প্যারামিটারটি পাস করতে পারেন ।
মাটিয়াস গ্রায়োনি

4
@ কোড_ড্রেড এটি প্রত্যাশিত আচরণ। স্থিতিশীল-সাজানোর বিন্দু একটি "বাছাই কী" ব্যবহার করে বাছাই করা হয় তবে একই ধরণের ক্রম কী থাকা দুটি পৃথক উপাদান একই ক্রমে থাকবে। একটি টিপলের জন্য ডিফল্ট বাছাই কী টিপলের সমস্ত উপাদান।
গায়ারাড

29

তারা স্থিতিশীল

উপায় দ্বারা: আপনি কখনও কখনও একক পাসের মধ্যে একাধিক পাস সাজানোর সমন্বয়ে বাছাই এবং সাজানো স্থিতিশীল কিনা তা জেনেও এড়াতে পারবেন।

উদাহরণস্বরূপ, আপনি যদি তাদের last_name, first_nameগুণাবলীর উপর ভিত্তি করে অবজেক্টগুলি বাছাই করতে চান তবে আপনি এটি একটি পাসে করতে পারেন:

sorted_list= sorted(
    your_sequence_of_items,
    key= lambda item: (item.last_name, item.first_name))

টিপল তুলনা সুবিধা গ্রহণ।

এই উত্তরটি যেমনটি হয় তেমন আসল প্রশ্নটি coversেকে দেয়। আরও বাছাই সংক্রান্ত প্রশ্নের জন্য, আছে পাইথন বাছাইকরণ কীভাবে করবেন


4
আপনি যদি বাছাই করতে চান তবে এটি অনাকাঙ্ক্ষিত প্রভাব ফেলতে পারে। উদাহরণস্বরূপ, পণ্যগুলি বাছাই করার সময়, আপনি প্রথমে রেটিং (আরোহী ক্রম) এবং তারপরে দামে (এছাড়াও আরোহী) বাছাই করতে পারেন। যদি আপনি এটির বিপরীত হন তবে আপনি উত্থানের ক্রমে রেটিং বাছাই করতে চান তবে আরোহণের ক্রমে দাম অনুসারে। এটি এই সমাধানটির সাথে কাজ করে না।
রিমকো উইন্ড্ট

4
@ রেমকোভেন্ড: আপনার বিবরণটির কোনও প্রয়োজন ছিল না। যাই হোক না কেন, যুক্তির পরিবর্তে key= lambda item: (-item.rating, item.price)একটি সরবরাহ বা বিবেচনা করুন । যদিও আপনার মন্তব্যের উদ্দেশ্য সম্পর্কে আমি এখনও নিশ্চিত নই। cmpkey
tzot

4
প্রকৃতপক্ষে এটি কোনও প্রয়োজন ছিল না, তবে যখন অন্য লোকেরা এটি পড়েন এবং আপনার সমাধানের মধ্যে বা পাইথনের স্থিতিশীল বাছাই করা বৈশিষ্ট্যটি ব্যবহার করেন তখন এই সূক্ষ্ম পার্থক্যটি চিহ্নিত করতে চেয়েছিলেন।
রিমকো উইন্ড্ট

আমি দেখি. অন্য কথায়, জোড় অনুসারে বাছাই করা আরও স্পষ্ট এবং এইভাবে আপনি পারফরম্যান্সের বিষয়ে চিন্তা না করা পছন্দনীয়। আমি কল্পনা করতে পারি যে দুটি স্থিতিশীল প্রকারের জোড় অনুসারে এক ধরণের তুলনায় কিছুটা দ্রুত, যদিও পার্থক্যটি নগন্য -
সের্গেই ওরশানস্কি

8
@ টোট আমি উল্লেখ করতে চাই, স্থিতিশীল বাছাইয়ের জন্য সর্বদা এ জাতীয় প্রয়োজনীয়তা রয়েছে। উদাহরণস্বরূপ, আমার কাছে টুপল (রেট, কমেন্ট) এর একটি তালিকা রয়েছে, মন্তব্যগুলি কখন তৈরি করা হয় তার ক্রমে সংরক্ষণ করা হয় এবং আমি হারটি অনুসারে বাছাই করতে চাই এবং সময়ের ক্রমটি রাখতে চাই, তবে আমি সংরক্ষণ করি নি তালিকায় টাইমস্ট্যাম্প। সংক্ষেপে বলতে গেলে, আমি কেবল তালিকা অনুসারে বাছাই করতে চাই এবং একই ক্রমে মন্তব্যটি রাখতে চাই।
wsysuper

4

এর মধ্যে ডকুমেন্টেশন পরিবর্তিত হয়েছে ( প্রাসঙ্গিক প্রতিশ্রুতি ) এবং বর্তমান ডকুমেন্টেশন sortedস্পষ্টভাবে এটির গ্যারান্টি দেয়:

অন্তর্নির্মিত sorted()ফাংশনটি স্থিতিশীল হওয়ার গ্যারান্টিযুক্ত। একটি সাজান স্থিতিশীল হয় যদি এটি সমান তুলনাকারী উপাদানের আপেক্ষিক ক্রমটি পরিবর্তন না করার গ্যারান্টি দেয় - এটি একাধিক পাসে বাছাইয়ের জন্য সহায়ক (উদাহরণস্বরূপ, বিভাগ দ্বারা বাছাই করা, তারপরে বেতন গ্রেড দ্বারা)।

নথিপত্রের এই ভাগে পাইথন 2.7 এবং পাইথন 3.4 (+ +) যোগ করা হয়েছিল তাই কোনো অনুবর্তী যে ভাষার সংস্করণটি বাস্তবায়ন করা উচিত আছে একটি স্থিতিশীল sorted

নোট করুন সিপিথনের জন্য পাইথন ২.৩list.sort থেকে স্থিতিশীল রয়েছে

  • টিম পিটারস তার list.sort()প্রয়োগটি পুনরায় লিখেছিলেন - এটি একটি "স্থিতিশীল সাজান" (সমান ইনপুট একই ক্রমে আউটপুটে প্রদর্শিত হয়) এবং আগের চেয়ে দ্রুত।

আমি 100% নিশ্চিত নই sorted, আজকাল এটি সহজ ব্যবহার করে list.sortতবে আমি এর জন্য ইতিহাস পরীক্ষা করে দেখিনি। তবে সম্ভবত এটি "সর্বদা" ব্যবহৃত হয় list.sort


0

"কি নতুন" পাইথন 2.4 এর জন্য দস্তাবেজ কার্যকরভাবে "সরকারী" দস্তাবেজে আপনি যদিও না দরকার পয়েন্ট যে সাজানো () প্রথম, একটি তালিকা তৈরি করে তাহলে এটি আহ্বান সাজানোর (), গ্যারান্টি দিয়ে আপনি প্রদান করা। আপনি যদি সত্যিই উদ্বিগ্ন হন তবে আপনি কেবল উত্সটিও পরীক্ষা করতে পারেন।


4
আপনি বলতে পারেন যেখানে এটি তাই বলে? এটি বলছে যে বাছাই করা () "ইন-প্লেস তালিকার মতো কাজ করে ort
- মনিকা

গঠিত "অনুলিপি" হ'ল একটি তালিকা (যা আপনি প্রত্যাবর্তনের মান হিসাবে পান) এবং ফিরে আসার আগে সেই তালিকায় .sort () কল করা হয়। কিউইডি না, এটি একটি অযোগ্য প্রমাণ নয়, তবে পাইথনের কোনও সরকারী মান না পাওয়া পর্যন্ত আপনি তা পাবেন না।
পিটার হ্যানসেন

0

বাছাইয়ের উপর পাইথন ৩.6 ডকটি এখন উল্লেখ করেছে

প্রকারভেদগুলি স্থিতিশীল হওয়ার গ্যারান্টিযুক্ত

তদুপরি, সেই দস্তাবেজে স্থিতিশীল টিমসোর্টের একটি লিঙ্ক রয়েছে , যা এতে উল্লেখ করে

ভার্সন ২.৩ থেকে টিমসোর্ট পাইথনের স্ট্যান্ডার্ড বাছাই অ্যালগরিদম

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.