ترتيب القوائم في Python: الفرز تصاعديًا وتنازليًا باستخدام sort() و sorted()
مقدمة إلى ترتيب البيانات في Python
يُعد ترتيب البيانات من العمليات الأساسية في البرمجة، خصوصًا عند التعامل مع القوائم أو عرض النتائج للمستخدم بشكل منظم. في Python، يمكنك تنفيذ الفرز بطريقتين شائعتين: sort() وsorted(). وعلى الرغم من أن الطريقتين تؤديان الغرض نفسه من حيث إعادة ترتيب العناصر، فإن بينهما فروقًا مهمة تؤثر على طريقة الاستخدام والنتيجة النهائية.
في هذا المقال، ستتعرف على الفرق بين sort() وsorted()، وكيفية استخدام كل منهما للفرز التصاعدي والتنازلي، مع أمثلة عملية توضّح متى تختار كل أسلوب.

ما هي الدالة sort() في Python؟
تُستخدم الدالة sort() مع القوائم فقط، وتقوم بترتيب عناصر القائمة نفسها مباشرة، أي أنها تعدّل القائمة الأصلية in place دون إنشاء قائمة جديدة. لذلك، فهي لا تُرجع قيمة يمكن تخزينها، وغالبًا تكون قيمتها المعادة None.
فرز قائمة تصاعديًا باستخدام sort()
في المثال التالي، نبدأ بقائمة غير مرتبة من الأرقام، ثم نستخدم sort() لترتيبها من الأصغر إلى الأكبر:
my_list = [ 67 , 2 , 999 , 1 , 15 ]
# this prints the unordered list
print( "Unordered list: " , my_list)
# sorts the list in place
my_list.sort()
# this prints the ordered list
print( "Ordered list: " , my_list)

لماذا تُرجع sort() القيمة None؟
لأن sort() لا تنشئ قائمة جديدة، بل ترتب القائمة نفسها مباشرة. لهذا السبب، إذا حاولت طباعة ناتجها، فستحصل على None:
my_list = [ 6 , 7 , 8 , 9 , 10 ]
# this will return None because the list is already sorted
print(my_list.sort())

من الناحية العملية، الأفضل استخدام sort() بهذه الصورة:
- استدعِ الدالة لترتيب القائمة.
- ثم اطبع القائمة نفسها بعد الترتيب.
استخدام key مع sort()
تدعم sort() وسيطين اختياريين مهمين هما key وreverse. يُستخدم key لتحديد معيار الفرز، أي الدالة التي ستُطبق على كل عنصر قبل المقارنة بين العناصر.
في المثال التالي، نستخدم len() لفرز الأسماء حسب طول النص من الأقصر إلى الأطول:
names = [ "Jessica" , "Ben" , "Carl" , "Jackie" , "Wendy" ]
print( "Unsorted: " , names)
names.sort(key=len)
print( "Sorted: " , names)

استخدام reverse مع sort()
أما الوسيط reverse فيقبل قيمة منطقية True أو False. عند تمرير True، يتم عكس الترتيب ليصبح تنازليًا أو بترتيب أبجدي عكسي وفقًا لنوع البيانات.
names = [ "Jessica" , "Ben" , "Carl" , "Jackie" , "Wendy" ]
print( "Unsorted: " , names)
names.sort(reverse= True )
print( "Sorted: " , names)

كيف تعمل الدالة sorted() في Python؟
تختلف sorted() عن sort() في نقطة جوهرية: فهي لا تعدّل البيانات الأصلية، بل تُرجع قائمة جديدة مرتبة اعتمادًا على أي كائن قابل للتكرار iterable. وهذا يشمل القوائم lists، والسلاسل النصية strings، وtuples، وغيرها.
فرز قائمة أرقام تصاعديًا باستخدام sorted()
sorted_numbers = sorted([ 77 , 22 , 9 , -6 , 4000 ])
print( "Sorted in ascending order: " , sorted_numbers)

هذا الأسلوب مفيد عندما تحتاج إلى الاحتفاظ بالبيانات الأصلية دون تعديل، مع إنشاء نسخة مرتبة للاستخدام في موضع آخر داخل البرنامج.
الفرز التنازلي باستخدام sorted()
مثل sort()، تدعم sorted() أيضًا الوسيطين key وreverse. ويمكنك استخدام reverse=True للحصول على ترتيب من الأكبر إلى الأصغر:
sorted_numbers = sorted([ 77 , 22 , 9 , -6 , 4000 ], reverse= True )
print( "Sorted in descending order: " , sorted_numbers)

الفرق بين sort() وsorted()
قبل اختيار أي منهما، من المهم فهم الفروق العملية التالية:
| المقارنة | sort() |
sorted() |
|---|---|---|
| نوع الاستخدام | تعمل مع list فقط |
تعمل مع أي iterable |
| طريقة الفرز | تُعدّل القائمة الأصلية مباشرة | تُرجع قائمة جديدة مرتبة |
| القيمة المعادة | None |
قائمة جديدة |
| أفضل استخدام | عند الرغبة في تعديل القائمة نفسها | عند الحاجة للحفاظ على الأصل وإنشاء نسخة مرتبة |
استخدام sorted() مع النصوص والكائنات القابلة للتكرار
إحدى أبرز مزايا sorted() أنها لا تقتصر على القوائم. في المثال التالي، نستخدم split() لتقسيم جملة إلى كلمات، ثم نرتب هذه الكلمات حسب الطول:
my_sentence = "Jessica found a dollar on the ground"
print( "Original sentence: " , my_sentence)
print(sorted(my_sentence.split(), key=len))

الفرز من الأطول إلى الأقصر
يمكن تعديل المثال السابق بسهولة ليصبح الفرز تنازليًا حسب طول الكلمة:
my_sentence = "Jessica found a dollar on the ground"
print( "Original sentence: " , my_sentence)
print(sorted(my_sentence.split(), key=len, reverse= True ))

فرز tuples في Python باستخدام sorted()
يمكن أيضًا استخدام sorted() مع البيانات المركبة مثل tuples. لنفترض أن لدينا قائمة تحتوي على بيانات طلاب فرقة موسيقية، وكل عنصر يتضمن الاسم والعمر والآلة الموسيقية:
band_students = [ ( 'Danny' , 17 , 'Trombone' ), ( 'Mary' , 14 , 'Flute' ), ( 'Josh' , 15 , 'Percussion' ) ]
إذا أردنا ترتيب هذه البيانات حسب العمر، فيمكننا استخدام lambda داخل key. ودالة lambda هي دالة مختصرة مجهولة الاسم، تُستخدم كثيرًا في مثل هذه الحالات.
lambda student: student[ 1 ]
يعني ذلك أن Python ستعتمد على العنصر الموجود في الفهرس [1] داخل كل tuple، وهو العمر.
الفرز حسب عمر الطالب
band_students = [ ( 'Danny' , 17 , 'Trombone' ), ( 'Mary' , 14 , 'Flute' ), ( 'Josh' , 15 , 'Percussion' ) ]
print(sorted(band_students, key= lambda student: student[ 1 ]))

الفرز حسب الآلة الموسيقية بترتيب عكسي
يمكن أيضًا تغيير معيار الفرز ليصبح وفق اسم الآلة الموسيقية، مع استخدام reverse=True للحصول على ترتيب أبجدي عكسي:
band_students = [ ( 'Danny' , 17 , 'Trombone' ), ( 'Mary' , 14 , 'Flute' ), ( 'Josh' , 15 , 'Percussion' ) ]
print(sorted(band_students, key= lambda student: student[ 2 ], reverse= True ))

متى تستخدم sort() ومتى تستخدم sorted()؟
استخدم sort() عندما:
- تكون البيانات من نوع
list. - لا تحتاج إلى الاحتفاظ بترتيب العناصر الأصلي.
- تريد تنفيذ الفرز مباشرة على القائمة نفسها.
استخدم sorted() عندما:
- تحتاج إلى قائمة جديدة مرتبة دون تعديل الأصل.
- تتعامل مع
stringأوtupleأو أيiterableآخر. - ترغب في كتابة كود أكثر مرونة عند معالجة أنواع بيانات متعددة.
نصائح عملية لتحسين كتابة كود الفرز في Python
- لا تستخدم
print(my_list.sort())إذا كنت تتوقع نتيجة مرتبة، لأن الناتج سيكونNone. - استفد من
keyلتخصيص منطق الفرز بدلًا من كتابة معالجة إضافية بعد الترتيب. - استخدم
lambdaعند الحاجة إلى فرز البيانات المركبة مثل القوائم التي تحتوي علىtuplesأو كائنات مخصصة. - اختر
sorted()إذا كان الحفاظ على النسخة الأصلية من البيانات مهمًا في التطبيق.
الخلاصة التقنية
يوفر كل من sort() وsorted() طريقة فعالة لترتيب البيانات في Python، لكن الاختيار الصحيح بينهما يعتمد على نوع البيانات وسلوكك المطلوب تجاه المصدر الأصلي. إذا كنت تتعامل مع قائمة وتريد تعديلها مباشرة، فإن sort() خيار مناسب وبسيط. أما إذا كنت تحتاج إلى مرونة أكبر أو تريد الحفاظ على البيانات الأصلية، فستكون sorted() هي الخيار الأفضل. من منظور عملي، فهم الفرق بين الطريقتين يساعدك على كتابة كود أوضح وأكثر كفاءة، خاصة في المشاريع التي تتعامل مع هياكل بيانات متعددة ومعايير فرز مخصصة.