بايثون بالمثال 12: ترتيب عناصر List في Python باستخدام sort و sorted

ترتيب عناصر List في Python باستخدام sort و sorted للمبتدئين

في الدروس العملية السابقة من سلسلة بايثون بالمثال تعاملنا مع القوائم List بطرق متعددة، مثل المرور على العناصر، فلترة القيم، واستخراج عناصر معينة حسب شرط. واليوم ننتقل إلى مهارة عملية جدًا ستحتاجها في أغلب البرامج: ترتيب عناصر List في Python.

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

{getToc} $title={محتوى المقال}

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

ما معنى ترتيب عناصر List في Python؟

ترتيب عناصر القائمة يعني إعادة تنظيم العناصر حسب تسلسل معين. إذا كانت القائمة تحتوي على أرقام، يمكن ترتيبها من الأصغر إلى الأكبر أو من الأكبر إلى الأصغر. وإذا كانت تحتوي على نصوص، يمكن ترتيبها أبجديًا.

مثال قائمة أرقام غير مرتبة:

numbers = [5, 2, 9, 1, 7]

بعد الترتيب تصاعديًا تصبح:

[1, 2, 5, 7, 9]

وبعد الترتيب تنازليًا تصبح:

[9, 7, 5, 2, 1]

شرح فكرة ترتيب عناصر List في Python تصاعديًا وتنازليًا

لماذا نرتب القوائم في Python؟

ترتيب القوائم ليس مجرد شكل جميل للبيانات، بل يساعدك في بناء برامج أوضح وأسهل في القراءة والتحليل.

  • ترتيب درجات الطلاب من الأقل إلى الأعلى أو من الأعلى إلى الأقل.
  • عرض الأسعار من الأرخص إلى الأغلى.
  • ترتيب الأسماء أبجديًا.
  • معرفة أكبر أو أصغر قيمة بسهولة.
  • تجهيز البيانات قبل عرضها للمستخدم.
  • تنظيم نتائج البحث أو التقارير.

الطريقة الأولى: استخدام sort لترتيب القائمة نفسها

الدالة sort() تستخدم لترتيب القائمة نفسها مباشرة. هذا يعني أنها تعدّل القائمة الأصلية ولا تنشئ قائمة جديدة.

numbers = [5, 2, 9, 1, 7]

numbers.sort()

print(numbers)

الناتج:

[1, 2, 5, 7, 9]

لاحظ أن القائمة numbers نفسها تغير ترتيبها.

نقطة مهمة: sort لا ترجع قائمة جديدة

من الأخطاء الشائعة أن يكتب المبتدئ:

numbers = [5, 2, 9]

result = numbers.sort()

print(result)

الناتج:

None

لماذا؟ لأن sort() ترتب القائمة الأصلية في مكانها، لكنها لا ترجع قائمة جديدة. لذلك إذا أردت رؤية النتيجة، اطبع القائمة نفسها:

numbers = [5, 2, 9]

numbers.sort()

print(numbers)
انتبه: لا تكتب result = list.sort() إذا كنت تتوقع قائمة جديدة. دالة sort() تعدّل القائمة الأصلية وترجع None. {alertWarning}

الطريقة الثانية: استخدام sorted لإنشاء قائمة مرتبة جديدة

الدالة sorted() لا تعدّل القائمة الأصلية، بل تنشئ نسخة مرتبة جديدة.

numbers = [5, 2, 9, 1, 7]

sorted_numbers = sorted(numbers)

print(sorted_numbers)
print(numbers)

الناتج:

[1, 2, 5, 7, 9]
[5, 2, 9, 1, 7]

لاحظ أن sorted_numbers مرتبة، لكن القائمة الأصلية numbers بقيت كما هي.

الفرق بين sort و sorted

المقارنة sort() sorted()
طريقة الاستخدام list.sort() sorted(list)
هل تعدّل القائمة الأصلية؟ نعم لا
هل ترجع قائمة جديدة؟ لا، ترجع None نعم
متى أستخدمها؟ عندما لا تحتاج القائمة الأصلية بترتيبها القديم عندما تريد الحفاظ على القائمة الأصلية

الفرق بين sort و sorted في Python ومتى نستخدم كل واحدة

قاعدة بسيطة: استخدم sort() إذا كنت تريد تعديل القائمة نفسها، واستخدم sorted() إذا كنت تريد نسخة مرتبة وتريد إبقاء الأصل كما هو.

ترتيب الأرقام في List باستخدام sort

لنطبق على قائمة درجات طلاب:

grades = [85, 70, 95, 60, 90]

grades.sort()

print(grades)

الناتج:

[60, 70, 85, 90, 95]

مثال ترتيب الأرقام داخل List في Python باستخدام sort و sorted

ترتيب الأرقام تنازليًا

إذا أردت الترتيب من الأكبر إلى الأصغر، استخدم reverse=True.

grades = [85, 70, 95, 60, 90]

grades.sort(reverse=True)

print(grades)
[95, 90, 85, 70, 60]

ونفس الفكرة تعمل مع sorted():

grades = [85, 70, 95, 60, 90]

high_to_low = sorted(grades, reverse=True)

print(high_to_low)

ترتيب النصوص داخل List

يمكن ترتيب النصوص أبجديًا أيضًا. مثال:

names = ["Omar", "Ali", "Sara", "Mona"]

names.sort()

print(names)

الناتج:

['Ali', 'Mona', 'Omar', 'Sara']

مثال ترتيب النصوص داخل List في Python أبجديًا باستخدام sort و sorted

ترتيب النصوص تنازليًا

names = ["Omar", "Ali", "Sara", "Mona"]

names.sort(reverse=True)

print(names)
['Sara', 'Omar', 'Mona', 'Ali']

ترتيب النصوص حسب الطول

أحيانًا لا تريد ترتيب النصوص أبجديًا، بل تريد ترتيبها حسب الطول. هنا نستخدم الوسيط key.

words = ["Python", "AI", "Programming", "Code"]

words.sort(key=len)

print(words)
['AI', 'Code', 'Python', 'Programming']

استخدمنا key=len حتى يكون معيار الترتيب هو طول النص.

ترتيب النصوص حسب الطول من الأطول إلى الأقصر

words = ["Python", "AI", "Programming", "Code"]

words.sort(key=len, reverse=True)

print(words)
['Programming', 'Python', 'Code', 'AI']

ترتيب قائمة تحتوي على حروف كبيرة وصغيرة

عند ترتيب النصوص الإنجليزية، قد تلاحظ أن الحروف الكبيرة والصغيرة تؤثر في الترتيب.

names = ["ali", "Sara", "mona", "Omar"]

names.sort()

print(names)
['Omar', 'Sara', 'ali', 'mona']

لجعل الترتيب غير حساس لحالة الأحرف، استخدم key=str.lower:

names = ["ali", "Sara", "mona", "Omar"]

names.sort(key=str.lower)

print(names)
['ali', 'mona', 'Omar', 'Sara']

ترتيب قائمة من القواميس

في المشاريع العملية قد تكون البيانات على شكل قائمة من القواميس. مثال:

students = [
    {"name": "Ali", "grade": 90},
    {"name": "Sara", "grade": 85},
    {"name": "Omar", "grade": 95}
]

إذا أردت ترتيب الطلاب حسب الدرجة، استخدم key مع lambda:

sorted_students = sorted(
    students,
    key=lambda student: student["grade"]
)

print(sorted_students)
[{'name': 'Sara', 'grade': 85}, {'name': 'Ali', 'grade': 90}, {'name': 'Omar', 'grade': 95}]

ترتيب القواميس من الأعلى إلى الأقل

sorted_students = sorted(
    students,
    key=lambda student: student["grade"],
    reverse=True
)

print(sorted_students)

هذه الطريقة مفيدة جدًا في مشاريع مثل ترتيب الطلاب، المنتجات، الأسعار، أو النتائج.

ترتيب قائمة من tuples

إذا كانت البيانات على شكل tuples:

products = [
    ("Book", 5),
    ("Pen", 2),
    ("Bag", 20)
]

sorted_products = sorted(products, key=lambda item: item[1])

print(sorted_products)
[('Pen', 2), ('Book', 5), ('Bag', 20)]

هل يمكن ترتيب قائمة تحتوي على أرقام ونصوص معًا؟

في Python 3، لا يمكنك ترتيب قائمة تحتوي على أرقام ونصوص معًا بشكل مباشر، لأن Python لا يعرف كيف يقارن رقمًا مع نص.

items = [10, "apple", 3, "banana"]

items.sort()

قد يظهر خطأ مثل:

TypeError: '<' not supported between instances of 'str' and 'int'

الأفضل أن تجعل القائمة تحتوي على نوع واحد من البيانات، أو تحدد طريقة مقارنة واضحة.

أخطاء شائعة عند ترتيب List في Python

1. تخزين نتيجة sort في متغير

خطأ:

result = numbers.sort()

الصحيح:

numbers.sort()
print(numbers)

أو استخدم:

result = sorted(numbers)

2. ترتيب قائمة فيها أنواع مختلفة

إذا كانت القائمة تحتوي على أرقام ونصوص معًا، قد يظهر TypeError. حاول توحيد نوع البيانات قبل الترتيب.

3. نسيان reverse=True للترتيب التنازلي

إذا أردت الترتيب من الأكبر إلى الأصغر، استخدم:

numbers.sort(reverse=True)

4. عدم فهم key

الوسيط key لا يغير العناصر نفسها، بل يحدد معيار الترتيب. مثل key=len لترتيب النصوص حسب الطول.

5. تعديل القائمة الأصلية بدون قصد

إذا كنت تحتاج القائمة الأصلية لاحقًا، لا تستخدم sort(). استخدم sorted() بدلًا منها.

مثال عملي كامل: ترتيب درجات الطلاب

grades = [78, 95, 88, 60, 92]

sorted_grades = sorted(grades, reverse=True)

print("الدرجات من الأعلى إلى الأقل:")
print(sorted_grades)

print("القائمة الأصلية:")
print(grades)
الدرجات من الأعلى إلى الأقل:
[95, 92, 88, 78, 60]
القائمة الأصلية:
[78, 95, 88, 60, 92]

مثال عملي: ترتيب منتجات حسب السعر

products = [
    {"name": "Pen", "price": 2},
    {"name": "Book", "price": 5},
    {"name": "Bag", "price": 20}
]

sorted_products = sorted(
    products,
    key=lambda product: product["price"]
)

for product in sorted_products:
    print(product["name"], "-", product["price"])
Pen - 2
Book - 5
Bag - 20

تدريب عملي

لديك القائمة التالية:

scores = [55, 90, 72, 88, 100, 64]

المطلوب:

  1. اطبع القائمة مرتبة تصاعديًا باستخدام sorted().
  2. اطبع القائمة مرتبة تنازليًا باستخدام sorted().
  3. اطبع القائمة الأصلية للتأكد أنها لم تتغير.
  4. استخدم sort() لترتيب القائمة الأصلية نفسها.

حل مختصر للتدريب

scores = [55, 90, 72, 88, 100, 64]

ascending = sorted(scores)
descending = sorted(scores, reverse=True)

print("تصاعدي:", ascending)
print("تنازلي:", descending)
print("الأصل:", scores)

scores.sort()
print("بعد sort:", scores)

أفضل ممارسات ترتيب القوائم

  • استخدم sort() عندما تريد تعديل القائمة الأصلية.
  • استخدم sorted() عندما تريد نسخة مرتبة جديدة.
  • لا تخزن نتيجة sort() في متغير.
  • استخدم reverse=True للترتيب التنازلي.
  • استخدم key عندما تريد ترتيبًا حسب معيار خاص مثل الطول أو السعر أو الدرجة.
  • تجنب ترتيب قائمة تحتوي على أنواع بيانات مختلفة بدون سبب واضح.
  • اختر أسماء متغيرات واضحة مثل sorted_numbers أو sorted_students.

روابط داخلية مفيدة من بايثون العرب

مصادر خارجية مفيدة للتوسع

الخلاصة

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

تعلمنا ترتيب الأرقام والنصوص تصاعديًا وتنازليًا، واستخدمنا key لترتيب النصوص حسب الطول والقواميس حسب قيمة معينة. كما تعرفنا على أخطاء شائعة مثل تخزين نتيجة sort() في متغير أو محاولة ترتيب قائمة تحتوي على أنواع بيانات مختلفة.

الخلاصة العملية: استخدم list.sort() عندما تريد تعديل القائمة مباشرة، واستخدم sorted(list) عندما تريد نسخة جديدة مرتبة بدون تغيير الأصل. {alertSuccess}

أسئلة شائعة مع إجاباتها

ما الفرق بين sort و sorted في Python؟

sort() تعدّل القائمة الأصلية ولا ترجع قائمة جديدة، أما sorted() فترجع قائمة جديدة مرتبة وتترك القائمة الأصلية كما هي.

لماذا result = numbers.sort() يعطيني None؟

لأن sort() ترتب القائمة نفسها وترجع None. إذا أردت قائمة جديدة استخدم sorted(numbers).

كيف أرتب List تنازليًا في Python؟

استخدم reverse=True مع sort() أو sorted().

كيف أرتب النصوص حسب الطول؟

استخدم key=len مثل words.sort(key=len) أو sorted(words, key=len).

هل يمكن ترتيب List تحتوي على أرقام ونصوص معًا؟

غالبًا لا يمكن ترتيبها مباشرة في Python 3، وقد يظهر TypeError. الأفضل توحيد نوع البيانات أو استخدام key مناسب.

متى أستخدم sorted بدل sort؟

استخدم sorted() عندما تريد الحفاظ على القائمة الأصلية وإنشاء نسخة مرتبة جديدة.

إرسال تعليق

أحدث أقدم