إذا أردت عكس ترتيب عناصر List في بايثون، فلديك ثلاث طرق شائعة: reverse() لتعديل القائمة الأصلية، وreversed() للحصول على iterator يمر على العناصر بالعكس، و[::-1] لإنشاء قائمة جديدة بترتيب معكوس.
في الدرس السادس من سلسلة بايثون بالمثال سنقارن هذه الطرق عمليًا، ونوضح الفرق المهم بينها حتى لا تقع في الخطأ الشائع result = numbers.reverse() ثم تتفاجأ بأن النتيجة None.
إذا كنت تريد فقط قلب ترتيب القائمة الحالي، فهذا الدرس يكفيك لاختيار الطريقة الصحيحة حسب ما إذا كنت تريد تعديل الأصل أو الاحتفاظ به.
سترى أيضًا لماذا لا تعني كلمة reverse ترتيب الأرقام تنازليًا، ومتى يكون المرور العكسي باستخدام reversed() أفضل من إنشاء نسخة جديدة من القائمة.
{getToc} $title={محتوى المقال}
{alertInfo} الخلاصة السريعة:reverse()تعدّل نفس القائمة، وreversed()تعيد reverse iterator، أما[::-1]فتعيد قائمة جديدة معكوسة.
ما معنى عكس عناصر List في بايثون؟
عكس القائمة لا يعني ترتيب قيمها من الأكبر إلى الأصغر أو من الأصغر إلى الأكبر. المقصود هو قلب ترتيب العناصر الحالي كما هو.
numbers = [1, 2, 3, 4, 5]
print(numbers[::-1])
الناتج:
[5, 4, 3, 2, 1]
إذا كانت القائمة الأصلية [1, 2, 3, 4, 5]، فإن آخر عنصر يصبح أول عنصر، والعنصر الأول ينتقل إلى النهاية.
الفرق بين reverse وreversed و[::-1] بسرعة
| الطريقة | تعدّل القائمة الأصلية؟ | ماذا ترجع؟ | متى تناسبك؟ |
|---|---|---|---|
list.reverse() |
نعم | None |
عندما تريد قلب نفس القائمة ولا تحتاج ترتيبها القديم |
reversed(list) |
لا | Reverse iterator | عندما تريد المرور على العناصر بالعكس دون إنشاء List جديدة مباشرة |
list[::-1] |
لا | List جديدة | عندما تريد نسخة معكوسة مختصرة مع إبقاء الأصل كما هو |
الطريقة الأولى: عكس القائمة باستخدام reverse()
الدالة reverse() هي method خاصة بالقوائم. وهي تقلب ترتيب عناصر القائمة داخل نفس الكائن، أي أنها تغيّر القائمة الأصلية مباشرة.
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers)
الناتج:
[5, 4, 3, 2, 1]
{alertSuccess}
استخدم reverse() عندما تريد تعديل القائمة الأصلية نفسها ولا تحتاج إلى الاحتفاظ بترتيبها السابق.
لماذا reverse() ترجع None؟
من أشهر أخطاء المبتدئين محاولة تخزين نتيجة reverse() في متغير:
numbers = [1, 2, 3]
result = numbers.reverse()
print(result)
print(numbers)
الناتج:
None
[3, 2, 1]
السبب أن reverse() تعدّل القائمة في مكانها ولا تنشئ قائمة جديدة. وهذا يتبع سلوكًا شائعًا في methods القوائم التي تغيّر القائمة نفسها مثل sort(): تكون القيمة المعادة None.
{alertWarning} لا تكتبresult = numbers.reverse()إذا كنت تنتظر قائمة داخلresult. اعكس القائمة أولًا، ثم استخدمnumbersنفسها.
الطريقة الثانية: استخدام reversed()
الدالة المدمجة reversed() لا تغيّر القائمة الأصلية. لكنها أيضًا لا تعيد List جاهزة؛ بل تعيد reverse iterator يمكنك المرور عليه.
numbers = [1, 2, 3, 4, 5]
for number in reversed(numbers):
print(number)
الناتج:
5
4
3
2
1
هذه الطريقة ممتازة عندما يكون هدفك المرور على العناصر بالعكس فقط، لأنك لا تحتاج إلى إنشاء قائمة جديدة.
كيف أحصل على List جديدة من reversed()؟
إذا كنت تحتاج النتيجة كقائمة، حوّل الـiterator باستخدام list():
numbers = [1, 2, 3, 4, 5]
reversed_numbers = list(reversed(numbers))
print(reversed_numbers)
print(numbers)
الناتج:
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
لاحظ أن numbers لم تتغير. القائمة الجديدة موجودة في reversed_numbers.
الطريقة الثالثة: استخدام slicing مع [::-1]
يمكن استخدام slicing بخطوة سالبة -1 للمرور من نهاية القائمة إلى بدايتها:
numbers = [1, 2, 3, 4, 5]
reversed_numbers = numbers[::-1]
print(reversed_numbers)
print(numbers)
الناتج:
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
القيمة -1 هي الـstep في slicing، ولذلك يتم أخذ العناصر من النهاية إلى البداية. والنتيجة هنا List جديدة، بينما تظل القائمة الأصلية كما هي.
{alertInfo}[::-1]طريقة مختصرة وواضحة بعد فهم slicing، لكنها تنشئ List جديدة. إذا كنت تريد فقط المرور على العناصر بالعكس، فـreversed()أنسب.
مثال عملي على عكس قائمة أسماء
names = ["Ahmed", "Sara", "Omar"]
reversed_names = names[::-1]
print(reversed_names)
الناتج:
['Omar', 'Sara', 'Ahmed']
الطرق نفسها تعمل مع List تحتوي على أرقام أو نصوص أو أي عناصر أخرى؛ لأنها تتعامل مع ترتيب العناصر، لا مع قيمها الحسابية.
عكس القائمة لا يعني ترتيبها تنازليًا
هناك فرق مهم بين Reverse وSort. العكس يقلب ترتيب العناصر الحالي، أما الترتيب فيقارن القيم وينظمها.
numbers = [3, 1, 5, 2]
reversed_copy = numbers[::-1]
sorted_desc = sorted(numbers, reverse=True)
print(reversed_copy)
print(sorted_desc)
الناتج:
[2, 5, 1, 3]
[5, 3, 2, 1]
النتيجتان مختلفتان: الأولى قلبت القائمة كما كانت، والثانية رتبت الأرقام من الأكبر إلى الأصغر.
كيف تختار الطريقة المناسبة؟
- اختر
reverse()إذا كنت تريد تعديل القائمة الأصلية نفسها. - اختر
reversed()إذا أردت المرور على العناصر بالعكس، خصوصًا داخلfor، دون إنشاء List جديدة مباشرة. - اختر
[::-1]إذا أردت List جديدة معكوسة بصيغة مختصرة.
أخطاء شائعة عند عكس List في بايثون
1. تخزين نتيجة reverse() وانتظار List
numbers = [1, 2, 3]
result = numbers.reverse()
print(result)
النتيجة None لأن القائمة نفسها هي التي تغيرت.
2. طباعة reversed() مباشرة
numbers = [1, 2, 3]
print(reversed(numbers))
سترى تمثيل كائن iterator بدل عناصر القائمة. إذا كنت تريد عرض العناصر كقائمة فاستخدم:
print(list(reversed(numbers)))
3. استخدام reverse() عندما تريد الاحتفاظ بالأصل
إذا كنت تحتاج القائمة الأصلية بعد ذلك، لا تعكسها مباشرة. استخدم [::-1] أو list(reversed(...))، أو أنشئ نسخة أولًا.
numbers = [1, 2, 3]
copy_numbers = numbers.copy()
copy_numbers.reverse()
print(numbers)
print(copy_numbers)
مثال واحد يجمع الطرق الثلاث
numbers = [1, 2, 3, 4, 5]
copy_one = numbers.copy()
copy_one.reverse()
copy_two = list(reversed(numbers))
copy_three = numbers[::-1]
print("reverse:", copy_one)
print("reversed:", copy_two)
print("slicing:", copy_three)
الناتج:
reverse: [5, 4, 3, 2, 1]
reversed: [5, 4, 3, 2, 1]
slicing: [5, 4, 3, 2, 1]
أسئلة شائعة
ما الفرق بين reverse() و reversed() في بايثون؟
reverse() method للقائمة وتغيّرها مباشرة وتعيد None. أما reversed() فهي دالة مدمجة تعيد reverse iterator دون تعديل القائمة الأصلية.
هل [::-1] تعدّل القائمة الأصلية؟
لا. عند استخدامها مع List فإنها تنشئ List جديدة بالعناصر نفسها لكن بترتيب معكوس.
ما أفضل طريقة لعكس List؟
لا توجد طريقة واحدة أفضل في كل الحالات. القرار يعتمد على حاجتك: تعديل الأصل، إنشاء نسخة جديدة، أو مجرد المرور على العناصر بالعكس.
هل reverse() ترتب القائمة من الأكبر إلى الأصغر؟
لا. reverse() تقلب ترتيب العناصر الحالي فقط. للترتيب حسب القيمة استخدم sort() أو sorted().
جرّب المثال بنفسك
استخدم محرر بايثون العرب وجرّب عكس القائمة التالية بالطرق الثلاث، ثم قارن هل تغيرت القائمة الأصلية أم لا:
languages = ["Python", "Java", "C++", "JavaScript"]
روابط مفيدة
- شرح القوائم Lists في بايثون للمبتدئين
- شرح Loops في بايثون للمبتدئين
- بايثون بالمثال 4: حساب مجموع عناصر List
- بايثون بالمثال 5: إيجاد أكبر وأصغر رقم في List
- سلسلة بايثون بالمثال
في المثال القادم
ننتقل بعد ذلك إلى بايثون بالمثال 7: حساب متوسط الأرقام في List باستخدام بايثون، حيث سنستخدم sum() وlen() معًا في مثال عملي.
المصادر
- توثيق بايثون الرسمي: List Methods
- توثيق بايثون الرسمي: reversed()
- توثيق بايثون الرسمي: Sequence Slicing
الخلاصة
لعكس عناصر List في بايثون، استخدم reverse() عندما تريد تعديل القائمة الأصلية، وreversed() عندما تريد iterator يمر بالعكس دون تغيير الأصل، و[::-1] عندما تريد List جديدة معكوسة بطريقة مختصرة.
{alertSuccess} القاعدة العملية: تعديل الأصل =reverse()، المرور بالعكس =reversed()، نسخة جديدة مختصرة =[::-1].