قوائم بايثون

تحتوي لغة بايثون على نوع قائمة جيد مدمَج اسمه "قائمة". تتم كتابة القيم الحرفية للقائمة بين قوسين مربعين [ ]. تعمل القوائم بشكل مشابه للسلاسل -- استخدم الدالة len() والأقواس المربعة [ ] للوصول إلى البيانات، مع وجود العنصر الأول في الفهرس 0. (اطّلِع على مستندات قائمة python.org الرسمية.)

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

قائمة بالسلاسل "أحمر" و"أزرق" و"أخضر"

لا يتم إنشاء نسخة من المهمة التي تتضمّن علامة = في القوائم. بدلاً من ذلك، تجعل التعيين المتغيرين يشيران إلى القائمة الواحدة في الذاكرة.

  b = colors   ## Does not copy the list

كل من اللونين وb إلى القائمة الواحدة

إنّ "القائمة الفارغة" هي مجرد زوج فارغ من الأقواس [ ]. تعمل علامة "+" على إلحاق قائمتَين، وبالتالي ناتج [1، 2] + [3، 4] ناتج [1، 2، 3، 4] (هذا تمامًا مثل + مع السلاسل).

إلى وIN

تعتبر التركيبات البرمجية *for* و *in* في لغة بايثون مفيدة للغاية، وأول استخدام لها هو استخدام القوائم. تعتبر بنية *for* -- for var in list -- طريقة سهلة للاطلاع على كل عنصر في القائمة (أو مجموعة أخرى). لا تضِف أو تزِل من القائمة أثناء التكرار.

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

إذا كنت تعرف نوع العنصر في القائمة، استخدِم اسم متغير في حلقة التكرار التي تسجِّل هذه المعلومات مثل "num" أو "name" أو "url". نظرًا لأن التعليمات البرمجية بايثون لا تحتوي على بناء جملة آخر لتذكيرك بالأنواع، فإن أسماء المتغيرات هي طريقة أساسية لك للحفاظ على ما يحدث بشكل مباشر. (هذه معلومات مضللة بعض الشيء. كلما زاد تعرضك للغة بايثون، سترى إشارات إلى تلميحات الكتابة التي تسمح لك بإضافة معلومات الكتابة إلى تعريفات الدوال. لا تستخدم بايثون تلميحات الأنواع هذه عند تشغيل برامجك. ويتم استخدامها بواسطة برامج أخرى مثل IDEs (بيئات التطوير المتكاملة) وأدوات التحليل الثابت مثل أدوات التحقق من الروابط/فحص الكتابة للتحقق مما إذا كان يتم استدعاء الدوال باستخدام وسيطات متوافقة).

وتُعدّ التركيبة *in* من تلقاء نفسها طريقة سهلة لاختبار ما إذا كان العنصر يظهر في قائمة (أو مجموعة أخرى) -- value in collection -- لاختبار ما إذا كانت القيمة موجودة في المجموعة، مع عرض True/False.

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

تُستخدم التركيبات for/in بشكل شائع في لغة البرمجة Python وتعمل على أنواع البيانات بخلاف القائمة، لذا يجب عليك فقط حفظ بناء الجملة الخاص بها. قد يكون لديك عادات من لغات أخرى حيث تبدأ في التكرار يدويًا على مجموعة، حيث يجب عليك استخدام لـ/in في بايثون.

يمكنك أيضًا استخدام for/in للعمل على سلسلة. وتعمل السلسلة كقائمة أحرفها، لذلك، تطبع for ch in s: print(ch) جميع الأحرف في سلسلة.

النطاق

ينتج عن الدالة range(n) الأرقام 0، 1، ... n-1، ويعرض النطاق(a، b) a، a+1، ... b-1 -- حتى الرقم الأخير ولكن لا يشمله. يتيح لك الجمع بين الدالة for-loop والدالة range() إنشاء حلقة رقمية تقليدية للتكرار:

  ## print the numbers from 0 through 99
  for i in range(100):
    print(i)

هناك متغير xrange() يتجنب تكلفة إنشاء القائمة الكاملة للحالات الحساسة للأداء (في بايثون 3، ستتمتع range() سلوك الأداء الجيد ويمكنك نسيان xrange()).

أثناء التكرار

تحتوي بايثون أيضًا على الطريقة القياسية while، وتعمل الجملة *break* و *continue* كما في C++ وJava، مما يغير مسار الحلقة الداخلية. تحل التكرارات الحلقية for/in أعلاه الحالة الشائعة للتكرار على كل عنصر في القائمة، ولكن التكرار الحلقي while يمنحك التحكم الكامل في أرقام الفهرس. إليك حلقة التكرار while التي تصل إلى كل عنصر ثالث في القائمة:

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

سرد الطرق

إليك بعض طرق القوائم الشائعة الأخرى.

  • list.append(elem) -- تضيف عنصرًا واحدًا إلى نهاية القائمة. خطأ شائع: لا يتم عرض القائمة الجديدة، بل تؤدي إلى تعديل القائمة الأصلية فقط.
  • list.insert(index, elem) -- لإدخال العنصر في الفهرس المحدد، مع نقل العناصر إلى اليمين.
  • list.extend(list2) إضافة العناصر الموجودة في list2 إلى نهاية القائمة. يشبه استخدام + أو += في القائمة استخدام extend().
  • list.index(elem) -- للبحث عن العنصر المحدد من بداية القائمة وإرجاع الفهرس الخاص بها. تطرح ValueError إذا لم يظهر العنصر (استخدم "in" للتحقق بدون ضبط ValueError).
  • list.remove(elem) -- البحث عن المثيل الأول للعنصر المحدد وإزالتها (تعرض ValueError إذا لم يكن موجودًا)
  • list.sort() -- فرز القائمة في مكانها (لا تؤدي إلى إرجاعها). (يفضل استخدام الدالة sorted() التي تظهر لاحقًا.)
  • list.reverse() -- لعكس القائمة في مكانها (لا تُرجعها)
  • list.pop(index) -- تزيل العنصر وتُرجعه في الفهرس المحدد. لعرض العنصر الموجود في أقصى اليمين إذا تم حذف الفهرس (مقابل append() تقريبًا).

لاحظ أن هذه *طرق* في كائن القائمة، بينما len() هي دالة تأخذ القائمة (أو سلسلة أو أي شيء) كوسيطة.

  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## append elem at end
  list.insert(0, 'xxx')        ## insert elem at index 0
  list.extend(['yyy', 'zzz'])  ## add list of elems at end
  print(list)  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print(list.index('curly'))    ## 2

  list.remove('curly')         ## search and remove that element
  list.pop(1)                  ## removes and returns 'larry'
  print(list)  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

خطأ شائع: لاحظ أن الطرق أعلاه لا *تعرض* القائمة المُعدّلة، وإنما تقوم فقط بتعديل القائمة الأصلية.

  list = [1, 2, 3]
  print(list.append(4))   ## NO, does not work, append() returns None
  ## Correct pattern:
  list.append(4)
  print(list)  ## [1, 2, 3, 4]

إنشاء القائمة

أحد الأنماط الشائعة هو بدء قائمة كقائمة فارغة []، ثم استخدام append() أو extend() لإضافة عناصر إليها:

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

إدراج شرائح

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

  list = ['a', 'b', 'c', 'd']
  print(list[1:-1])   ## ['b', 'c']
  list[0:2] = 'z'    ## replace ['a', 'b'] with ['z']
  print(list)         ## ['z', 'c', 'd']

تمرين: list1.py

للتدرب على المواد الموجودة في هذا القسم، جرّب المسائل في list1.py التي لا تستخدم الترتيب (في التمارين الأساسية).