ترتيب عناصر List في بايثون: sort و sorted | بايثون بالمثال 12

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

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

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

في هذا الدرس سنطبق الفرق عمليًا على الأرقام والنصوص والقواميس وTuples، ونوضح أشهر خطأ يقع فيه المبتدئون: كتابة result = numbers.sort() ثم الحصول على None.

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

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

الفرق بين sort و sorted في بايثون باختصار

المقارنة list.sort() sorted()
هل تعدّل القائمة الأصلية؟ نعم، ترتبها في مكانها لا، تترك الأصل كما هو
القيمة المرجعة None List جديدة مرتبة
ما الذي تعمل عليه؟ القوائم List فقط أي Iterable مثل List وTuple والنصوص
الترتيب التنازلي reverse=True reverse=True
الترتيب بمعيار خاص key=... key=...

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

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

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

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

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

[1, 2, 5, 7, 9]

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

[9, 7, 5, 2, 1]

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

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

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

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

الطريقة الأولى: استخدام 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 بقيت كما هي.

ومن الفروق المهمة أن sorted() ليست خاصة بالقوائم فقط؛ يمكنها استقبال أي كائن قابل للتكرار Iterable مثل Tuple أو النص، ثم تعيد العناصر المرتبة داخل List جديدة. أما list.sort() فهي method خاصة بالقوائم.

متى أستخدم sort ومتى أستخدم sorted؟

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


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

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

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

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

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

grades.sort()

print(grades)

الناتج:

[60, 70, 85, 90, 95]

مثال ترتيب الأرقام داخل List في بايثون باستخدام 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)
{alertInfo} لا تخلط بين reverse=True وlist.reverse(): الخيار reverse=True يجعل sort() أو sorted() ترتبان القيم تنازليًا، بينما reverse() تقلب ترتيب العناصر الحالي فقط دون فرزها حسب القيمة. راجع شرح عكس ترتيب عناصر List في بايثون.

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

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

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

names.sort()

print(names)

الناتج:

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

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

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

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

names.sort(reverse=True)

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

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

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

words = ["بايثون", "AI", "Programming", "Code"]

words.sort(key=len)

print(words)
['AI', 'Code', 'بايثون', 'Programming']

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

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

words = ["بايثون", "AI", "Programming", "Code"]

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

print(words)
['Programming', 'بايثون', '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)]

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

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

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

items.sort()

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

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

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

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

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 في بايثون من المهارات العملية المهمة جدًا. إذا أردت ترتيب القائمة نفسها، استخدم sort(). وإذا أردت إنشاء قائمة مرتبة جديدة مع الحفاظ على القائمة الأصلية، استخدم sorted().

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

إرسال تعليق

أحدث أقدم