مرحبًا بك في الدرس السادس من سلسلة بايثون بالمثال على موقع بايثون العرب.
{getToc} $title={محتوى المقال}
في هذا المثال سنتعلم كيف نقوم بـ عكس ترتيب عناصر List في Python بأكثر من طريقة، وسنفهم الفرق بين استخدام reverse() و reversed() و slicing.
هذا الدرس مهم جدًا للمبتدئين، لأن عكس القوائم من العمليات الشائعة في بايثون، وقد يسبب لبسًا خصوصًا عند استخدام reverse() لأنها تعدّل القائمة الأصلية ولا ترجع قائمة جديدة.
{alertInfo} في هذا المقال سنشرح الفكرة خطوة بخطوة، ثم نوضح متى تستخدم كل طريقة لعكس عناصر القائمة.
إذا كنت جديدًا على القوائم، يمكنك مراجعة: أساسيات بايثون 8: شرح Lists في Python للمبتدئين.
فكرة المثال ببساطة
لنفترض أن لدينا قائمة أرقام بهذا الشكل:
numbers = [1, 2, 3, 4, 5]
ونريد أن تصبح بهذا الشكل:
[5, 4, 3, 2, 1]
يعني نريد عكس ترتيب العناصر، بحيث يصبح آخر عنصر في البداية، وأول عنصر في النهاية.
الطريقة الأولى: استخدام reverse في Python
الطريقة الأولى هي استخدام الدالة reverse().
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers)
الناتج:
[5, 4, 3, 2, 1]
لاحظ أن reverse() قامت بتعديل القائمة نفسها.
{alertSuccess} استخدم reverse() عندما تريد عكس القائمة الأصلية نفسها ولا تحتاج إلى الاحتفاظ بترتيبها القديم.
خطأ شائع: تخزين reverse في متغير
من أكثر الأخطاء التي يقع فيها المبتدئون أنهم يكتبون:
numbers = [1, 2, 3, 4, 5]
result = numbers.reverse()
print(result)
الناتج سيكون:
None
والسبب أن reverse() لا ترجع قائمة جديدة، بل تعدّل القائمة الأصلية فقط.
الصحيح أن تكتب:
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers)
{alertError} لا تكتب result = numbers.reverse() إذا كنت تتوقع الحصول على قائمة جديدة، لأن reverse() ترجع None.
الطريقة الثانية: استخدام reversed في Python
الطريقة الثانية هي استخدام الدالة reversed().
هذه الدالة لا تعدّل القائمة الأصلية، لكنها تعطينا عناصر القائمة بترتيب عكسي.
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]
لاحظ أن القائمة الأصلية بقيت كما هي.
{alertInfo} استخدم reversed() عندما تريد الحصول على نسخة معكوسة بدون تغيير القائمة الأصلية.
لماذا استخدمنا list مع reversed؟
عند استخدام reversed() فإنها لا ترجع List مباشرة، بل ترجع كائنًا يمكن المرور عليه.
لذلك إذا أردنا تحويل الناتج إلى قائمة واضحة، نستخدم:
list(reversed(numbers))
وهذا يجعل الناتج قائمة يمكن طباعتها والتعامل معها بسهولة.
الطريقة الثالثة: استخدام Slicing لعكس List
من أشهر الطرق المختصرة في بايثون لعكس القائمة استخدام slicing بهذا الشكل:
numbers = [1, 2, 3, 4, 5]
reversed_numbers = numbers[::-1]
print(reversed_numbers)
الناتج:
[5, 4, 3, 2, 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]
{alertSuccess} طريقة slicing باستخدام [::-1] مختصرة جدًا ومشهورة في بايثون، لكنها قد تبدو غريبة قليلًا للمبتدئ في البداية.
مقارنة بين reverse و reversed و slicing
الآن لنقارن بين الطرق الثلاثة حتى تعرف متى تستخدم كل واحدة.
| الطريقة | هل تعدّل القائمة الأصلية؟ | هل ترجع قائمة جديدة؟ | متى أستخدمها؟ |
|---|---|---|---|
reverse() |
نعم | لا، ترجع None |
عندما تريد تعديل نفس القائمة |
reversed() |
لا | نعم بعد تحويلها بـ list() |
عندما تريد نسخة معكوسة بدون تغيير الأصل |
[::-1] |
لا | نعم | عندما تريد طريقة مختصرة وسريعة |
مثال عملي على عكس قائمة أسماء
ليست القوائم دائمًا أرقامًا فقط، يمكن أن تكون قائمة أسماء أيضًا.
names = ["Ahmed", "Sara", "Omar"]
reversed_names = names[::-1]
print(reversed_names)
الناتج:
['Omar', 'Sara', 'Ahmed']
الفكرة نفسها تعمل مع الأرقام والنصوص وأي عناصر داخل القائمة.
عكس القائمة ثم المرور عليها بحلقة for
أحيانًا لا تحتاج إلى إنشاء قائمة جديدة، بل تريد المرور على العناصر بترتيب عكسي فقط.
يمكنك استخدام reversed() مع for:
numbers = [1, 2, 3, 4, 5]
for number in reversed(numbers):
print(number)
الناتج:
5
4
3
2
1
هذه الطريقة مفيدة عندما تريد قراءة العناصر بالعكس فقط، بدون الحاجة إلى حفظ قائمة جديدة.
ما الفرق بين عكس القائمة وترتيبها؟
من المهم ألا تخلط بين عكس القائمة وترتيب القائمة.
عكس القائمة يعني قلب ترتيبها الحالي فقط.
numbers = [3, 1, 5, 2]
numbers.reverse()
print(numbers)
الناتج:
[2, 5, 1, 3]
أما الترتيب التصاعدي فيتم باستخدام sort() أو sorted().
numbers = [3, 1, 5, 2]
numbers.sort()
print(numbers)
الناتج:
[1, 2, 3, 5]
{alertWarning} reverse() لا ترتب الأرقام من الأكبر إلى الأصغر، بل تعكس ترتيب العناصر كما هي داخل القائمة.
أخطاء شائعة عند عكس List في Python
الخطأ الأول: اعتقاد أن reverse ترجع قائمة جديدة
كما شرحنا، هذا الكود لا يعطي قائمة جديدة:
result = numbers.reverse()
لأن reverse() ترجع None.
الخطأ الثاني: نسيان تحويل reversed إلى list
إذا كتبت:
numbers = [1, 2, 3]
print(reversed(numbers))
قد ترى ناتجًا غير مفهوم للمبتدئ، لأن reversed() ترجع كائنًا قابلًا للتكرار.
الأوضح:
print(list(reversed(numbers)))
الخطأ الثالث: الخلط بين reverse و sort
إذا أردت عكس القائمة استخدم reverse()، وإذا أردت ترتيبها استخدم sort().
{alertInfo} اسأل نفسك دائمًا: هل أريد قلب ترتيب القائمة الحالي؟ أم أريد ترتيب العناصر حسب القيمة؟
أفضل طريقة للمبتدئين
إذا كنت مبتدئًا في تعلم بايثون، فابدأ بهذه القاعدة:
- استخدم
reverse()إذا كنت تريد تعديل القائمة الأصلية. - استخدم
[::-1]إذا كنت تريد نسخة جديدة بطريقة مختصرة. - استخدم
reversed()إذا كنت تريد المرور على العناصر بالعكس أو إنشاء نسخة عند الحاجة.
ومع التدريب ستصبح هذه الفروقات واضحة جدًا.
الكود النهائي للمثال
هذا مثال يجمع الطرق الثلاث في مكان واحد:
numbers = [1, 2, 3, 4, 5]
# الطريقة الأولى: reverse تعدل القائمة الأصلية
copy_one = numbers.copy()
copy_one.reverse()
print("reverse:", copy_one)
# الطريقة الثانية: reversed مع list
copy_two = list(reversed(numbers))
print("reversed:", copy_two)
# الطريقة الثالثة: slicing
copy_three = numbers[::-1]
print("slicing:", copy_three)
الناتج:
reverse: [5, 4, 3, 2, 1]
reversed: [5, 4, 3, 2, 1]
slicing: [5, 4, 3, 2, 1]
روابط مفيدة
لفهم القوائم أكثر، اقرأ: أساسيات بايثون 8: شرح Lists في Python للمبتدئين.
وللتدرب على الحلقات التي تساعدك في التعامل مع القوائم، اقرأ: أساسيات بايثون 12: شرح Loops في Python للمبتدئين.
ويمكنك مراجعة توثيق بايثون الرسمي حول القوائم: Python Data Structures Documentation.
مقالات مقترحة من بايثون العرب
- بايثون بالمثال 4: حساب مجموع عناصر List في Python
- بايثون بالمثال 5: إيجاد أكبر وأصغر رقم في List باستخدام Python
- فن قراءة رسائل الخطأ في بايثون للمبتدئين
خلاصة المثال
في هذا الدرس تعلمنا كيف نعكس ترتيب عناصر List في Python بثلاث طرق مختلفة.
reverse()تعدّل القائمة الأصلية وترجعNone.reversed()لا تعدّل القائمة الأصلية، ويمكن تحويل نتيجتها إلى List.[::-1]طريقة مختصرة ترجع نسخة جديدة معكوسة.
{alertSuccess} إذا فهمت الفرق بين reverse و reversed و slicing، فقد قطعت خطوة مهمة في فهم طريقة تعامل Python مع القوائم.
تمرين بسيط لك
جرّب كتابة برنامج يحتوي على قائمة أسماء، ثم اطبعها:
- بالترتيب الأصلي.
- بالترتيب العكسي باستخدام
reverse(). - بالترتيب العكسي باستخدام
[::-1].
ابدأ بهذا الكود:
names = ["Ahmed", "Sara", "Omar", "Mona"]
print("Original:", names)
print("Reversed copy:", names[::-1])
في المثال القادم
في الدرس القادم من سلسلة بايثون بالمثال سنتعلم مثالًا عمليًا جديدًا يساعدك على استخدام القوائم والدوال بطريقة أوضح.