القوئم في بايثون عبارة عن مجموعة من العناصر بترتيب معين. حيث تسمح لك بتخزين أنواع مختلفة من البيانات كعناصر فردية داخل القائمة. من المحتمل أن تكون قوائم بايثون هي أكثر أنواع البيانات استخدامًا للعمل داخل لغة بايثون. من السهل جدًا فهم مفهوم القوائم حتى بالنسبة للمبرمجين الجدد، وهي مفهوم أساسي مهم في بايثون لأنها جزء من العديد من المفاهيم المختلفة في برمجة بايثون. في هذا الدرس سنتعلم كل شيء عن كيفية استخدام قوائم بايثون.
ما هي قوائم بايثون؟
القائمة عبارة عن بنية بيانات في لغة بايثون وهي عبارة عن تسلسل منظم وقابل للتغيير من العناصر. تعتبر القوائم مفيدة عندما تريد العمل مع العديد من القيم ذات الصلة. حيث تسهل تنظيم بياناتك أو إجراء نفس العملية على عناصر متعددة في نفس الوقت. يمكنك إنشاء قائمة تتضمن الأرقام من 0 إلى 9 أو الحروف الأبجدية أو أسماء الآيس كريم المفضلة لديك. على الرغم من أن تجميع العناصر المرتبطة معًا في قائمة أمر شائع، إلا أنه يمكنك وضع أي شيء تريده في القائمة، حتى لو لم تكن مرتبطة. نظرًا لأن القائمة عادةً ما تحتوي على أكثر من عنصر واحد فقط، فإن اسم المتغير للقائمة غالبًا ما يكون بصيغة الجمع.
كيفية إنشاء قائمة في بايثون
كما يتم تعريف السلاسل كأحرف بين علامتي الاقتباس ‘ ‘، يتم تعريف القوائم من خلال وجود قيم بين قوسين مربعين [ ]. في المثال التالي سنقوم بإنشاء قائمة فارغة في بايثون:
empty_list = []
و فيما يلي قائمة تحتوي على خضروات مختلفة. يتم فصل العناصر الفردية في القائمة بفواصل.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
عندما تستخدم دالة print()
في لغة Python لعرض قائمة، فإنها تُرجع محتويات القائمة بما في ذلك الأقواس المربعة.
print(veggies)
>>> ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
القوائم المختلطة
تحتوي قائمة التالية على عدة أنواع من البيانات : عدد صحيح،سلسلة، وقيمة منطقية، وقائمة، وقاموس، وكلها مضمنة كعناصر في القائمة.
many_types = [7, 'letter', True, ['Kale', 'Cabbage'], {'Garlic': 2, 'Okra': 1, 'Carrot': 5}]
for item in many_types:
print(type(item))
<class 'int'>
<class 'str'>
<class 'bool'>
<class 'list'>
<class 'dict'>
إجراءات و توابع قوائم بايثون
كل شيء في بايثون هو كائن، والكائنات لها توابع. يمكنك اتخاذ إجراءات مختلفة باستخدام هذه التوابع المتوفرة. و طبعا يحتوي كائن القائمة على عدة توابع مفيدة لاستخدامها مع القوائم. دعونا نلقي نظرة على عدد قليل منهم.
.count()
يقوم التابع count()
بإرجاع عدد المرات التي يظهر فيها العنصر المحدد في القائمة.
يقبل التابغ count()
وسيطة واحدة فقط عند استدعائها، وهو العنصر الذي يجب حساب تكراراته.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
lettuce = veggies.count('Lettuce')
print(f'You have {lettuce} lettuce.')
وستكون النتيجة :
You have 1 lettuce.
من خلال المثال السابق يؤكد التابع .count()
ما تعلمناه عنه، وهو أن هناك Lettuce واحدًا فقط في القائمة. و إذا كان هناك العديد من “Lettuce” في القائمة، فيمكن للتابع .count()
حساب عدد مرات ظهور “Lettuce” ويعطينا القيمة.
list.append()
يضيف التابع append()
عنصرًا إلى نهاية القائمة. و يأخذ وسيط واحد للعنصر، وهو العنصر الذي سيتم إضافته إلى نهاية القائمة. وبما أنه يمكننا وضع أي نوع بيانات داخل القائمة، فإن العنصر الملحق يمكن أن يكون سلسلة أو رقمًا أو قائمة أو قاموسًا أو أي نوع بيانات آخر.
دعونا نضيف “Lettuce” آخر إلى قائمتنا حتى نتمكن من اختبار التابع count()
مرة أخرى.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.append('Lettuce')
print(veggies)
>>> ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce', 'Lettuce']
رائع! الآن يمكننا تجربة التابع count()
مرة أخرى ورؤية النتيجة.
lettuce = veggies.count('Lettuce')
print(f'You have {lettuce} lettuce.')
>>> You have 2 lettuce.
list.index()
التابع index()
يقوم بإرجاع فهرس العنصر المحدد في القائمة.
يحتوي التابع Index()
على ثلاث وسائط محتملة:
- element – العنصر المراد البحث عنه.
- start (اختياري) – ابدأ البحث من هذا الفهرس.
- end (اختياري) – ابحث على العنصر حتى هذا الفهرس.
يقوم التابع index()
بإرجاع فهرس العنصر المحدد في القائمة، وإذا لم يتم العثور على العنصر، فستحصل على استثناء ValueError
.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
asparagus = veggies.index('Asparagus')
print(f'Asparagus is at index {asparagus}')
>>> Asparagus is at index 3
‘Asparagus’ موجود في الفهرس 3. وذلك لأن القوائم تبدأ عند 0، وليس 1. ونظرًا لأن الفهرس الأول هو 0، فإن الفهرس الأخير أقل بمقدار واحد من حجم القائمة.
إذا تم توفير المعلمة الثانية، فهذا هو المكان الذي يبدأ فيه Index()
بحثه من اليسار إلى اليمين. في المثال الموالي نبدأ البحث عند الرقم 4. و نظرًا لوجود ‘Asparagus’ في الفهرس 3، فلن يتم العثور على العنصر، و بالتالي ظهور استثناء.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
asparagus = veggies.index('Asparagus', 4)
print(f'Asparagus is at index {asparagus}')
Traceback (most recent call last):
File "C:/python/justhacking/lists.py", line 2, in <module>
asparagus = veggies.index('Asparagus', 4)
ValueError: 'Asparagus' is not in list
في هذا المثال التالي، سوف نستخدم ثلاث معلمات للتابع index()
. يمكننا تحديد العنصر المراد البحث عنه، والفهرس الذي نبدأ البحث فيه، والفهرس الذي ننهي البحث فيه. و نظرًا لأن العنصر الذي نبحث عنه موجود بالفعل بين قيم فهرس البداية والنهاية، فلدينا بحث ناجح عن الفهرس.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
celery = veggies.index('Celery', 1, 3)
print(f'Celery is at index {celery}')
Celery is at index 2
لرؤية فهرس كل عنصر في قائمة في بايثون، يمكنك استخدام المثال التالي الذي يستخدم دالة enumerate()
لتوفير فهرس يمكننا الوصول إليه في حلقة for
.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
for i, veggie in enumerate(veggies):
print(f'{veggie} is at index {i}')
Kale us at index 0
Cabbage us at index 1
Celery us at index 2
Asparagus us at index 3
Lettuce us at index 4
إذا كنت تعرف فهرس عنصر معين، فمن السهل الوصول إلى هذا العنصر باستخدام القوس المربع [ ] كما يلي:
print(veggies[1])
print(veggies[0])
print(veggies[3])
print(veggies[2])
print(veggies[4])
Cabbage
Kale
Asparagus
Celery
Lettuce
reverse()
إذا كنت تريد عكس ترتيب العناصر في القائمة، فيمكنك استدعاء التابع reverse()
.
لا تتوفر أية معلمات مع التابع .reverse() و السبب أنه يقوم بعكس القائمة في مكانها. و لا يُرجع قيمة، بل يعدل القائمة الفعلية.
يمكنك استخدام veggies.reverse()
، بدلاً من veggies = veggies.reverse()
.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.reverse()
print(veggies)
['Lettuce', 'Asparagus', 'Celery', 'Cabbage', 'Kale']
يعمل التابع reverse()
على تغيير ترتيب القائمة بشكل دائم، ولكن يمكنك العودة إلى الترتيب الأصلي عن طريق تطبيق reverse()
على نفس القائمة مرة أخرى إذا كنت بحاجة إلى ذلك.
clear()
يقوم التابع Clear()
بإزالة جميع العناصر من القائمة ويكون تركيبها كما هو موضح:
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.clear()
print(veggies)
>>> []
insert()
بالإضافة إلى التابع append()
الذي تكلمنا عنه، هناك أيضًا التابع insert()
الذي يمكن استخدامه لإضافة عناصر إلى القائمة. الفرق بين append()
و insert()
هو أنه مع append()
تتم إضافة القيمة إلى نهاية القائمة. اما عند استخدام insert()
، يمكن إدراج قيمة في القائمة أينما تريد.
لا يقوم التابع insert()
بإرجاع أي شيء و يكتفي بتحديث القائمة الموجودة.
لإدراج عنصر في بداية القائمة، استخدم الفهرس 0. ولإدراج عنصر في الموضع الثالث، استخدم الفهرس 2.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.insert(0, 'Spinach')
print(veggies)
['Spinach', 'Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
pop()
يتم استخدام التابع pop()
لإخراج عنصر من نهاية القائمة، و خلال هذه العملية يحدث شيئين. يتم تعديل القائمة الأصلية، ويتم إرجاع العنصر الذي تمت إزالته حتى تتمكن من تخزين هذا العنصر في متغير. إذا قمت بتمرير قيمة فهرس لتابع pop()
، فستتمكن من تحديد العنصر الذي سيتم إخراجه من القائمة.
- يقبل التابع
pop()
وسيط واحد فقط (الفهرس). - إذا لم يتم تمرير وسيط، فسيتم تمرير الفهرس الافتراضي -1 كوسيط (فهرس العنصر الأخير).
- إذا كان الفهرس الذي تم تمريره إلى التابع ليس في النطاق، فسوف تحصل على خطأ
IndexError
(فهرس منبثق خارج النطاق).
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
most_favorite = veggies.pop()
print(most_favorite)
>>> Lettuce
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
least_favorite = veggies.pop(0)
print(least_favorite)
>>> Kale
remove()
إذا كنت لا تعرف موضع القيمة التي تريد إزالتها من القائمة، فيمكنك استخدام التابع remove()
. حيث يقوم بإزالة العنصر المطابق الأول (الذي يتم تمريره كوسيط) من القائمة.
- يقبل التابع
remove()
عنصرًا واحدًا كوسيط ويزيله من القائمة.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.remove('Kale')
print(veggies)
['Cabbage', 'Celery', 'Asparagus', 'Lettuce']
sort()
يسهل التابع sort()
في فرز القائمة. حيث يقوم بفرز عناصر قائمة معينة بترتيب تصاعدي أو تنازلي .
- reverse – إذا كان True، فسيتم فرز القائمة بترتيب عكسي (تنازلي).
- key – دالة تحددها لمقارنة الفرز.
- يقوم التابع sort() بتعديل القائمة الأصلية في مكانها.
- إذا كنت تريد إرجاع القائمة التي تم فرزها بدلاً من تغيير القائمة الأصلية، فاستخدم sorted() بدلاً من ذلك.
veggies = ['Kale', 'Cabbage', 'Celery', 'Asparagus', 'Lettuce']
veggies.sort()
print(veggies)
['Asparagus', 'Cabbage', 'Celery', 'Kale', 'Lettuce']
ما هي دالة list()؟
تُستخدم دالة list()
لإنشاء قائمة جديدة. وإليكم توضيح لأهم استخداماتها:
1. إنشاء قائمة فارغة:
- يمكنك إنشاء قائمة فارغة ببساطة عن طريق استدعاء الدالة list() بدون أي وسيطات:
my_list = list() # تُنشئ قائمة فارغة
print(my_list) # سيطبع []
2. إنشاء قائمة من أي iterable:
- يمكن استخدام الدالة list() لإنشاء قائمة من أي عنصر قابل للتكرار (iterable)، مثل السلاسل النصية، والمجموعات، والقاموس، وغيرها:
# إنشاء قائمة من سلسلة نصية:
my_list = list("مرحبا")
print(my_list) # سيطبع ['م', 'ر', 'ح', 'ب', 'ا']
# إنشاء قائمة من مجموعة:
my_set = {1, 2, 3}
my_list = list(my_set)
print(my_list) # سيطبع [1, 2, 3]
3. تحويل tuple إلى قائمة:
- يمكن تحويل tuple إلى قائمة باستخدام دالة
list()
:
my_tuple = (10, 20, 30)
my_list = list(my_tuple)
print(my_list) # سيطبع [10, 20, 30]
4. أخذ المدخلات من المستخدم وتحويلها إلى قائمة:
- يمكن استخدام دالة
list()
لتحويل المدخلات التي يدخلها المستخدم إلى قائمة:
numbers = input("أدخل أرقاما مفصولة بفواصل: ")
my_list = list(numbers.split(","))
print(my_list)
نكتفي بهذا القدر الذي تعلمناه عن ما هي القوائم وكيفية التعامل مع العناصر الفردية في القائمة. لقد تعلمنا كيفية تحديد القائمة و إضافة العناصر وإزالتها وكذلك فرز القوائم. كما ألقينا نظرة على توابع بايثون المدمجة التي يمكننا استخدامها مع القوائم.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.