قوائم بايثون

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

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

قائمة السلاسل "red" "أزرق" أخضر

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

  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". نظرًا لأن كود بايثون لا يحتوي على بنية أخرى لتذكيرك بالأنواع، فإن أسماء المتغيرات هي طريقة رئيسية للحفاظ على ما يحدث بشكل مستقيم. (هذا أمر مضلل بعض الشيء. وكلما تعرضت بشكل أكبر للغة بايثون، ستظهر لك مراجع حول تلميحات الكتابة التي تتيح لك إضافة الكتابة المعلومات إلى تعريفات الدوال. لا تستخدم بايثون تلميحات النوع هذه عند تشغيلها برامجك. ويتم استخدامها من قبل برامج أخرى مثل بيئات التطوير المتكاملة (IDE) أدوات التحليل الثابتة مثل لينتر/مدققات النوع للتحقق مما إذا كان يتم استدعاء الدوال باستخدام وسيطات متوافقة.)

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

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

تُستخدم دوال for/in بشكل شائع جدًا في التعليمات البرمجية بايثون وتعمل على أنواع بيانات غير القائمة، لذا يجب عليك فقط حفظ بناء الجملة الخاص بها. قد تكون لديك عادات بلغات أخرى حيث تبدأ في التكرار يدويًا على مجموعة، وفي بايثون يجب عليك استخدام for/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() إنشاء حلقة رقمية تقليدية للتكرار الحلقي for:

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

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

أثناء التكرار الحلقي

وتحتوي بايثون أيضًا على معلمة while-loop العادية، وتعمل العبارتان *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() تقريبًا).

لاحظ أن هذه هي *methods* في كائن قائمة، بينما 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() أوextension() لإضافة عناصر إليها:

  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 التي لا تستخدم التصنيف (في التمارين الأساسية).