cb
codebamin
الفصل 6 · القوائم (Lists)

دوال وأساليب القوائم الأساسية

لنراجع طرق التعامل مع القوائم. افترض أن لدينا nums = [1, 2, 3]. يمكنك استخدام:

  • append: لإضافة عنصر إلى نهاية القائمة. nums.append(4) تغيّر القائمة إلى [1, 2, 3, 4].
  • len: تُرجع عدد العناصر. len(nums) تساوي 3.
  • range: التعبير range(n) كائن يشبه قائمة الأعداد من 0 إلى n - 1، أي يحتوي على n أعداد. ولذلك range(len(nums)) تشبه [0, 1, 2]، وهي فهارس جميع عناصر nums.
  • [] (الفهرسة): للوصول إلى قيمة عند فهرس معين. nums[0] تساوي 1 وnums[1] تساوي 2 وnums[2] تساوي 3.
  • +: لدمج القوائم. nums + [4, 5] تنتج [1, 2, 3, 4, 5].

لاحظ أن nums.append(4) تعدّل القائمة الموجودة نفسها، بينما nums + [4, 5] لا تعدّل nums. ويمكن الاحتفاظ بنتيجة nums + [4, 5] بإسنادها إلى متغير جديد. شغّل الكود التالي:

__copyable__ __program_indented__

كما ترى، العامل + لا يعدّل nums نفسها، بينما append تفعل ذلك.

إليك فكرة جديدة: الإسناد عبر الفهرس (Subscript assignment). يمكنك تعيين قيمة جديدة في فهرس معين، لتحل محل القيمة السابقة، بالصيغة:

some_list[index] = new_value

سيظهر خطأ إذا لم يكن index فهرسًا صالحًا داخل some_list. شغّل المثال التالي:

__program_indented__

index: تُرجع أول فهرس تظهر عنده قيمة معينة داخل القائمة، بالصيغة:

some_list.index(value)

ويظهر خطأ إذا لم تكن القيمة موجودة. جرّب هذا السطر في الطرفية:

[7, 8, 9, 8].index(8)

pop: تحذف عنصرًا عند فهرس محدد وتُرجع ذلك العنصر، بالصيغة:

some_list.pop(index)

إذا استدعيتها من دون وسيط، أي some_list.pop()، فإنها تحذف العنصر الأخير وتُرجعه. ويظهر خطأ إذا لم يكن index فهرسًا صالحًا في القائمة. شغّل المثال:

__program_indented__

remove: تحذف أول ظهور لقيمة معينة، بالصيغة:

some_list.remove(value)

ويظهر خطأ إذا لم تكن القيمة موجودة في القائمة. شغّل المثال:

__program_indented__

ستحل الآن أربعة تمارين قصيرة على هذه الأفكار. في القائمة التالية أسطر صحيحة وأخرى خاطئة مختلطة معًا. لكل تمرين قادم حل يتضمن سطرًا واحدًا فقط من هذه القائمة، ومهمتك اختيار السطر الصحيح:

x[len(x)] = x[0] x[len(x) - 1] = x[0] x[len(x) + 1] = x[0] x + x[0] [x] + x[0] x + [x[0]] [x] + [x[0]] x + x.pop(0) [x] + x.pop(0) x + [x.pop(0)] [x] + [x.pop(0)] x.pop(x.append(0)) x.append(x.pop(0)) x.append(x[0]) x.append(x.index(0)) x.index(x.append(0)) x.pop(x.index(0)) x.index(x.pop(0))

إليك برنامجًا غير مكتمل:

__copyable__ x = ['a', 'b', 'c'] (insert_one_line_from_above) print(x)

استبدل السطر الأوسط بسطر واحد من القائمة السابقة. يجب أن يعدّل البرنامج النهائي x بنقل العنصر الأول إلى النهاية، بحيث يطبع ['b', 'c', 'a'].

أحسنت. في التمرين التالي ابدأ من البرنامج غير المكتمل نفسه:

__copyable__ x = ['a', 'b', 'c'] (insert_one_line_from_above) print(x)

اختر سطرًا من القائمة السابقة يستبدل العنصر الأخير في x بالعنصر الأول، بحيث يطبع البرنامج ['a', 'b', 'a'].

ممتاز!

ربما لاحظت أن الوصول إلى العنصر الأخير باستخدام x[len(x) - 1] طويل قليلًا. يمكنك كتابة الشيء نفسه بصورة أبسط: x[-1]. وبالمثل يمكن كتابة العنصر قبل الأخير x[len(x) - 2] على صورة x[-2]، وهكذا. يسمح بايثون بالعد من نهاية القائمة إلى الخلف، ويبدأ العنصر الأخير بالفهرس -1.

| الفهرس | العنصر الأول | العنصر الثاني | العنصر الثالث | ... | قبل الأخير | الأخير | |---|---|---|---|---|---|---| | من البداية | 0 | 1 | 2 | ... | len(x) - 2 | len(x) - 1 | | من النهاية | -len(x) | -len(x) + 1 | -len(x) + 2 | ... | -2 | -1 |

التمرين التالي مختلف قليلًا: لن تعدّل القائمة x، بل ستنشئ قائمة جديدة اسمها y:

__copyable__ x = ['a', 'b', 'c'] y = (insert_one_line_from_above) print(y)

يجب أن تكون y مثل x مع تكرار العنصر الأول في النهاية. لذلك يجب أن يطبع البرنامج ['a', 'b', 'c', 'a'].

عمل رائع. والآن التمرين الأخير:

__copyable__ x = [1, 2, 0, 3] x.remove(0) print(x)

استبدل السطر الأوسط x.remove(0) بسطر من القائمة السابقة يؤدي النتيجة نفسها.

عمل رائع!

solution.py
1
2
3
4
5
6
7
8
9
10
الطرفية (shell)
>>>