بايثون بالمثال 6: عكس ترتيب عناصر List في Python باستخدام reverse و reversed و slicing

بايثون بالمثال 6: عكس ترتيب عناصر List في Python باستخدام reverse و reversed و slicing

مرحبًا بك في الدرس السادس من سلسلة بايثون بالمثال على موقع بايثون العرب.

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

في هذا المثال سنتعلم كيف نقوم بـ عكس ترتيب عناصر List في Python بأكثر من طريقة، وسنفهم الفرق بين استخدام reverse() و reversed() و slicing.

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

{alertInfo} في هذا المقال سنشرح الفكرة خطوة بخطوة، ثم نوضح متى تستخدم كل طريقة لعكس عناصر القائمة.

إذا كنت جديدًا على القوائم، يمكنك مراجعة: أساسيات بايثون 8: شرح Lists في Python للمبتدئين.

فكرة المثال ببساطة

لنفترض أن لدينا قائمة أرقام بهذا الشكل:

numbers = [1, 2, 3, 4, 5]

ونريد أن تصبح بهذا الشكل:

[5, 4, 3, 2, 1]

يعني نريد عكس ترتيب العناصر، بحيث يصبح آخر عنصر في البداية، وأول عنصر في النهاية.

صورة توضح قائمة أرقام في Python تتحول من الترتيب الطبيعي إلى الترتيب العكسي

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

شرح أن دالة reverse في Python تعدل القائمة الأصلية وترجع 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] لا نعم عندما تريد طريقة مختصرة وسريعة

مقارنة بين reverse و reversed و slicing لعكس عناصر List في Python بدون أو مع تعديل القائمة الأصلية

مثال عملي على عكس قائمة أسماء

ليست القوائم دائمًا أرقامًا فقط، يمكن أن تكون قائمة أسماء أيضًا.

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() إذا كنت تريد المرور على العناصر بالعكس أو إنشاء نسخة عند الحاجة.

ومع التدريب ستصبح هذه الفروقات واضحة جدًا.

ملخص طرق عكس عناصر List في Python باستخدام reverse و reversed و slicing مع أمثلة للنتيجة

الكود النهائي للمثال

هذا مثال يجمع الطرق الثلاث في مكان واحد:

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.

مقالات مقترحة من بايثون العرب

خلاصة المثال

في هذا الدرس تعلمنا كيف نعكس ترتيب عناصر 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])

في المثال القادم

في الدرس القادم من سلسلة بايثون بالمثال سنتعلم مثالًا عمليًا جديدًا يساعدك على استخدام القوائم والدوال بطريقة أوضح.

إرسال تعليق

أحدث أقدم