ترتيب القوائم في Python: الفرز تصاعديًا وتنازليًا باستخدام sort() و sorted()

دقائق القراءة: 5

مقدمة إلى ترتيب البيانات في Python

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

في هذا المقال، ستتعرف على الفرق بين sort() وsorted()، وكيفية استخدام كل منهما للفرز التصاعدي والتنازلي، مع أمثلة عملية توضّح متى تختار كل أسلوب.

ترتيب القوائم في Python باستخدام 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)

مثال على ترتيب قائمة أرقام تصاعديًا في Python باستخدام sort

لماذا تُرجع 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 في Python وإظهار أنها تعيد None

من الناحية العملية، الأفضل استخدام sort() بهذه الصورة:

  • استدعِ الدالة لترتيب القائمة.
  • ثم اطبع القائمة نفسها بعد الترتيب.

استخدام key مع sort()

تدعم sort() وسيطين اختياريين مهمين هما key وreverse. يُستخدم key لتحديد معيار الفرز، أي الدالة التي ستُطبق على كل عنصر قبل المقارنة بين العناصر.

في المثال التالي، نستخدم len() لفرز الأسماء حسب طول النص من الأقصر إلى الأطول:

names = [ "Jessica" , "Ben" , "Carl" , "Jackie" , "Wendy" ]
print( "Unsorted: " , names)
names.sort(key=len)
print( "Sorted: " , names)

فرز قائمة أسماء في Python حسب طول الاسم باستخدام key=len

استخدام reverse مع sort()

أما الوسيط reverse فيقبل قيمة منطقية True أو False. عند تمرير True، يتم عكس الترتيب ليصبح تنازليًا أو بترتيب أبجدي عكسي وفقًا لنوع البيانات.

names = [ "Jessica" , "Ben" , "Carl" , "Jackie" , "Wendy" ]
print( "Unsorted: " , names)
names.sort(reverse= True )
print( "Sorted: " , names)

فرز قائمة أسماء تنازليًا في Python باستخدام reverse=True مع sort

كيف تعمل الدالة 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 في Python لفرز قائمة أرقام تصاعديًا

هذا الأسلوب مفيد عندما تحتاج إلى الاحتفاظ بالبيانات الأصلية دون تعديل، مع إنشاء نسخة مرتبة للاستخدام في موضع آخر داخل البرنامج.

الفرز التنازلي باستخدام sorted()

مثل sort()، تدعم sorted() أيضًا الوسيطين key وreverse. ويمكنك استخدام reverse=True للحصول على ترتيب من الأكبر إلى الأصغر:

sorted_numbers = sorted([ 77 , 22 , 9 , -6 , 4000 ], reverse= True )
print( "Sorted in descending order: " , sorted_numbers)

فرز قائمة أرقام تنازليًا في Python باستخدام sorted و reverse=True

الفرق بين 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))

فرز كلمات جملة في Python حسب الطول باستخدام sorted

الفرز من الأطول إلى الأقصر

يمكن تعديل المثال السابق بسهولة ليصبح الفرز تنازليًا حسب طول الكلمة:

my_sentence = "Jessica found a dollar on the ground"
print( "Original sentence: " , my_sentence)
print(sorted(my_sentence.split(), key=len, reverse= True ))

فرز كلمات الجملة من الأطول إلى الأقصر في Python باستخدام sorted

فرز 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 ]))

فرز قائمة tuples في Python حسب العمر باستخدام sorted و lambda

الفرز حسب الآلة الموسيقية بترتيب عكسي

يمكن أيضًا تغيير معيار الفرز ليصبح وفق اسم الآلة الموسيقية، مع استخدام reverse=True للحصول على ترتيب أبجدي عكسي:

band_students = [ ( 'Danny' , 17 , 'Trombone' ), ( 'Mary' , 14 , 'Flute' ), ( 'Josh' , 15 , 'Percussion' ) ]
print(sorted(band_students, key= lambda student: student[ 2 ], reverse= True ))

فرز بيانات tuples في Python حسب الآلة الموسيقية بترتيب تنازلي

متى تستخدم sort() ومتى تستخدم sorted()؟

استخدم sort() عندما:

  • تكون البيانات من نوع list.
  • لا تحتاج إلى الاحتفاظ بترتيب العناصر الأصلي.
  • تريد تنفيذ الفرز مباشرة على القائمة نفسها.

استخدم sorted() عندما:

  • تحتاج إلى قائمة جديدة مرتبة دون تعديل الأصل.
  • تتعامل مع string أو tuple أو أي iterable آخر.
  • ترغب في كتابة كود أكثر مرونة عند معالجة أنواع بيانات متعددة.

نصائح عملية لتحسين كتابة كود الفرز في Python

  1. لا تستخدم print(my_list.sort()) إذا كنت تتوقع نتيجة مرتبة، لأن الناتج سيكون None.
  2. استفد من key لتخصيص منطق الفرز بدلًا من كتابة معالجة إضافية بعد الترتيب.
  3. استخدم lambda عند الحاجة إلى فرز البيانات المركبة مثل القوائم التي تحتوي على tuples أو كائنات مخصصة.
  4. اختر sorted() إذا كان الحفاظ على النسخة الأصلية من البيانات مهمًا في التطبيق.

الخلاصة التقنية

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *