بنية البيانات هي طريقة لتنظيم وتخزين البيانات. تحتوي لغة بايثون على العديد من هياكل البيانات المضمنة، بما في ذلك القوائم والمصفوفات والمجموعات والقواميس. وكلها لها خصائص مختلفة، مما يجعلها مفيدة في مواقف مختلفة. القوائم مفيدة بشكل خاص لأنها مرنة للغاية. لذلك، فإن إتقان العمل مع القوائم في بايثون يعد خطوة مهمة نحو أن تصبح مبرمجًا جيدًا.
في هذه المقالة، سنعلمك كيفية عمل قوائم بايثون. سنستعرض 12 تمرين مصممًا لتعليمك جوانب مختلفة لتخزين البيانات ومعالجتها في القوائم. ولا تقلق؛ فهناك حلول مفصلة. سنبدأ بالأساسيات المناسبة للمبتدئين ثم ننتقل إلى مفاهيم أكثر تقدمًا.
قبل أن نبدأ…
للتأكد من أننا جميعًا على نفس الصفحة قبل أن نبدأ في حل التمارين، دعنا نغطي أساسيات قوائم بايثون. يمكن إنشاء قائمة فارغة باستخدام أقواس مربعة ([]
) أو باستخدام دالة list()
المضمنة في بايثون. سنستخدم الطريقة الأولى لإنشاء قائمة فارغة تسمى data:
>>> data = []
يمكننا تنظيم البيانات وتخزينها في قائمة. فلنقم بإنشاء القائمة مرة أخرى، ولكن هذه المرة ببعض الأعداد الصحيحة المفصولة بفاصلة:
>>> data = [1, 1, 2, 3, 5, 8, 13]
يمكن للقائمة تخزين العديد من أنواع البيانات المختلفة. دعنا نحدد قائمة بأربع سلاسل:
>>> colors = ['red', 'blue', 'green', 'yellow']
عند إنشاء قائمة، يتم تعيين فهرس عدد صحيح فريد لكل عنصر. العنصر الأول له الفهرس 0، والثاني له الفهرس 1، وهكذا.
تتضمن قوائم بايثون العديد من التوابع المرتبطة بها، وسنستخدم بعضها في هذه التمارين. للحصول على بعض المعلومات الأساسية، راجع نظرة عامة على توابع قائمة بايثون. هذا كل ما تحتاج إلى معرفته في هذه المرحلة. لنبدأ ببعض التمارين.
التمرين 1: الوصول إلى عناصر القائمة… أو عدم الوصول إليها
فيما يلي سلسلة من التمارين القصيرة لتحضيرك للتسخين. باستخدام قائمة الألوان المحددة أعلاه، اطبع:
- العنصر الأول.
- العنصر الثاني.
- العنصر الأخير.
- العنصر قبل الأخير.
- العنصر الثاني والثالث.
- العنصر عند الفهرس 4.
الحل
print(colors[0])
'red'print(colors[1])
'blue'print(colors[-1])
'yellow'print(colors[-2])
'green'print(colors[1:3])
['blue', 'green']print(colors[4])
IndexError: list index out of range
هذا التمرين أساسي جدًا لفهم كيفية عمل القوائم. مفتاح حل هذه المشكلة هو تذكر أن الفهرسة في بايثون تبدأ من الصفر. أي أن العنصر الأول له الفهرس 0، والثاني له الفهرس 1، وهكذا. أيضًا، العنصر الأخير له الفهرس -1، والعنصر قبل الأخير له الفهرس -2، وهكذا.
أخيرًا، يؤدي محاولة الوصول إلى عنصر باستخدام فهرس غير موجود إلى ظهور خطأ IndexError
. سيتعين عليك أن تتأقلم مع هذا الخطأ، لأنك ستواجهه طوال حياتك المهنية في البرمجة. لمزيد من التفاصيل حول هذا التمرين، راجع المقالة كيفية إصلاح خطأ “List index out of range” في بايثون.
في هذا التمرين، نستخدم الدالة print()
لعرض النتائج. نظرًا لأنك ستستخدم هذه الدالة المضمنة كثيرًا، فراجع دالة طباعة في بايثون للحصول على مزيد من التفاصيل حول كيفية استخدام هذه الدالة.
التمرين 2: تعيين قيم جديدة لعناصر القائمة
فيما يلي قائمة بسبعة قيم عددية صحيحة تمثل منسوب المياه اليومي (بالسنتيمتر) في بحيرة وهمية. ومع ذلك، هناك خطأ في البيانات. يجب أن يكون منسوب المياه في اليوم الثالث 693. صحح الخطأ واطبع القائمة المتغيرة.
water_level = [730, 709, 682, 712, 733, 751, 740]
الحل
water_level[2] = 693
print(water_level)
[730, 709, 693, 712, 733, 751, 740]
يعتمد هذا التمرين على التمرين السابق. تحتاج إلى الوصول إلى العنصر الثالث، الذي يحمل الفهرس 2، وإعادة تعيين القيمة إلى 693 ببساطة. ثم قم بطباعة القائمة المعدلة لمعرفة ما إذا كان التغيير قد تم بشكل صحيح.
التمرين 3: إضافة عناصر جديدة إلى القائمة
أضف بيانات اليوم الثامن إلى القائمة أعلاه. كان مستوى المياه 772 سم في ذلك اليوم. اطبع محتويات القائمة بعد ذلك.
الحل
water_level.append(772)
print(water_level)
[730, 709, 693, 712, 733, 751, 740, 772]
يعتبر التابع list.append()
واحدة من أهم طرق التوابع، حيث تستخدم لإضافة عنصر جديد إلى نهاية القائمة، وبعد القيام بذلك، سيزداد طول القائمة بمقدار واحد.
التمرين 4: إضافة عناصر متعددة جديدة إلى القائمة
مع الاستمرار في استخدام نفس القائمة، أضف ثلاثة أيام متتالية باستخدام تعليمة واحدة. كانت مستويات المياه في الأيام من التاسع إلى الحادي عشر 772 سم، و770 سم، و745 سم. أضف هذه القيم ثم اطبع القائمة بالكامل.
الحل
new_data = [772, 770, 745]
water_level = water_level + new_data
print(water_level)
[730, 709, 693, 712, 733, 751, 740, 772, 772, 770, 745]
يتعين علينا أولاً تعريف قائمة جديدة، والتي نطلق عليها new_data. تحتوي هذه القائمة الجديدة على القيم الثلاث المتتالية التي نريد إضافتها إلى قائمة water_level. ثم نستخدم عامل الجمع (+) لربط القائمتين. باستخدام عامل التعيين (=)، نقوم بتعيين النتائج مرة أخرى إلى قائمة water_level لكي تكون التغييرات دائمة. وأخيرًا، نطبع القائمة المعدلة للتحقق من النتائج.
التمرين 5: حذف قيمة من القائمة
هناك طريقتان لحذف البيانات من القائمة: باستخدام الفهرس أو باستخدام القيمة. ابدأ بقائمة water_level الأصلية التي حددناها في التمرين الثاني واحذف العنصر الأول باستخدام الفهرس الخاص بها. ثم قم بتعريف القائمة مرة أخرى واحذف العنصر الأول باستخدام قيمته.
الحل
water_level = [730, 709, 682, 712, 733, 751, 740]
del water_level[0]
print(water_level)
[709, 682, 712, 733, 751, 740]
water_level = [730, 709, 682, 712, 733, 751, 740]
water_level.remove(730)
print(water_level)
[709, 682, 712, 733, 751, 740]
ابدأ بتحديد القائمة. لحذف العنصر الأول باستخدام فهرسه، استخدم عامل del. ملاحظة: تأكد من تحديد العنصر الصحيح الذي تريد حذفه. إذا قمت بتنفيذ del water_level فقط، فسوف تحذف القائمة بأكملها.
بالنسبة للطريقة الثانية، ابدأ مرة أخرى بتحديد القائمة. لحذف العنصر الأول بناءً على قيمته، استخدم التابع list.remove()
. تتطلب هذه الطريقة وسيطة واحدة: القيمة المراد حذفها. إذا ظهرت القيمة عدة مرات في القائمة، فسيتم حذف أول عنصر فقط.
التمرين 6: العبارات الشرطية
يتم تقديم قائمة مكونة من 12 قيمة في متغير يسمى tourism_arrivals. تمثل القيم عدد السياح (بالملايين) الذين زاروا فرنسا في كل شهر من عام 2016.
اكتب برنامجًا يطلب من المستخدم رقمًا ويتحقق مما إذا كان هناك شهر بقيمة تطابق الرقم المدخل تمامًا. إذا كان هناك مثل هذا الشهر، اطبع: “Value found”. وإلا، اطبع “Value not found”.
tourist_arrivals = [7.8, 9.0, 10.4, 10.9, 14.7, 15.6, 22.7, 22.3, 14.8, 11.4, 8.6, 9.1]
الحل
number = float(input('Enter monthly arrivals: '))
if number in tourist_arrivals:
print('Value found')
else:
print('Value not found')
نبدأ بقائمتنا التي تحتوي على أرقام عائمة. باستخدام الدالة المضمنة input()
، يمكننا قبول إدخال المستخدم من لوحة المفاتيح وتعيين الإدخال للمتغير number. بعد ذلك، باستخدام عبارة if-else
، نختبر ما إذا كان number موجودًا في قائمتنا. إذا كان الأمر كذلك، نطبع “Value found” (القيمة الموجودة)؛ إذا لم يكن كذلك، نطبع “Value not found” (القيمة غير موجودة).
التمرين 7: تكرار عناصر القائمة حسب القيمة
فيما يلي قائمة تتضمن نفقات لإمرأة الشهرية. تنقسم نفقاتها الشهرية إلى ثلاث فئات:
- منخفض: أقل من 0
- متوسط: بين 2000.0 و3000.0
- مرتفع: أكبر من 0
قم بتحليل الإنفاق الشهري، وإنشاء متغيرات منخفضة ومتوسطة وعالية، ثم قم بطباعة الجملة التالية:
‘Martha’s spending was low for {x} months, medium for {y} months and high for {z} months.’
monthly_spending = [2689.56, 2770.38, 2394.04, 2099.91, 3182.20, 3267.12, 1746.83, 2545.72, 3328.20, 3147.30, 2462.61, 3890.45, 3000.00, 2000.00]
الحل
low=0
medium=0
high=0
for spending in monthly_spending:
if spending < 2000:
low += 1
elif 2000 <= spending <= 3000:
medium += 1
else:
high += 1
print('Martha\'s spending was low for', low,'months, medium for', medium,'months and high for', high,'months.')
نبدأ بإنشاء ثلاثة متغيرات جديدة: low وmedium وhigh، وكلها مهيأة إلى الصفر لتخزين عدد الأشهر التي تم فيها الإنفاق في الفئات المعنية. ثم ننتقل عبر قيم القائمة ونستخدم كتلة if-elif-else
للتحقق من الفئة التي يندرج فيها هذا المبلغ. نستخدم عامل +=
لزيادة العدادات بمقدار واحد، وفي السطر الأخير نطبع النتائج.
التمرين 8: تكرار عناصر القائمة حسب الفهرس
ترغب إمرأة في معرفة متوسط نفقاتها لكل نصف من السنة. احسب متوسط نفقاتها للنصف الأول من السنة (من يناير إلى يونيو) والنصف الثاني من السنة (من يوليو إلى ديسمبر). اعرض المعلومات على النحو التالي:
- متوسط المصروفات من يناير إلى يونيو: {متوسط النصف الأول من العام}
- متوسط المصروفات من يوليو إلى ديسمبر: {متوسط النصف الثاني من العام}
الحل
monthly_spending = [2689.56, 2770.38, 2394.04, 2099.91, 3182.20, 3267.12, 1746.83, 2545.72, 3328.20, 3147.30, 2462.61, 3890.45]
sum_expenses = [0, 0]
for index in range(len(monthly_spending)):
if index < 6:
sum_expenses[0] += monthly_spending[index]
else:
sum_expenses[1] += monthly_spending[index]
print('Average expense Jan-June: {}'.format(sum_expenses[0] / 6))
print('Average expense July-Dec: {}'.format(sum_expenses[1] / 6))
نبدأ بقائمة monthly_spending. لتخزين النتائج، ننشئ قائمة تحتوي على عنصرين، كلاهما صفر. ثم ننتقل عبر فهرس القائمة. يخبرنا الفهرس بالشهر (0 = يناير، 1 = فبراير، …، 6 = يوليو، … 11 = ديسمبر). نختبر ما إذا كانت النفقات سابقة لشهر يوليو من خلال اختبار ما إذا كان الفهرس أقل من 6. إذا كان الأمر كذلك، نستخدم الفهرس للوصول إلى القيمة من قائمة monthly_spending وإضافة النفقات إلى العنصر الأول من قائمة sum_expenses. إذا لم يكن الأمر كذلك، نضيف النفقات إلى العنصر الثاني من قائمة sum_expenses.
التمرين 9: إنشاء قوائم جديدة بناءً على القوائم الموجودة
يتم التعبير عن النفقات حاليًا بالدولار الأمريكي. أنشئ قائمة جديدة باسم monthly_spending_eur تحتوي على نفس النفقات المحولة إلى اليورو. استخدم سعر الصرف 1 دولار أمريكي = 0.88 يورو. قم بتقريب قيمة اليورو إلى منزلتين عشريتين باستخدام round(value, 2)
. ثم اطبع قائمة monthly_spending_eur.
الحل
monthly_spending = [2689.56, 2770.38, 2394.04, 2099.91, 3182.20, 3267.12, 1746.83, 2545.72, 3328.20, 3147.30, 2462.61, 3890.45]
monthly_spending_eur = []
for spending in monthly_spending:
monthly_spending_eur.append(round(spending * 0.88, 2))
print(monthly_spending_eur)
مفتاح حل هذا التمرين هو تهيئة قائمة فارغة خارج الحلقة. ستخزن هذه القائمة نفقاتنا باليورو. ثم نكرر النفقات ونضيف المبالغ المحولة إلى القائمة الجديدة باستخدام التابع list.append()
. وأخيرًا، نطبع القائمة الجديدة.
التمرين 10: مقارنة قائمتين بأحجام مختلفة
في عام 2017، كانت نفس المرأة تمتلك بطاقتي ائتمان: واحدة استخدمتها طوال العام، وأخرى استخدمتها فقط خلال الأشهر الستة الأولى. فيما يلي قيم الإنفاق الشهري لكلتا البطاقتين. مهمتك هي إنشاء قائمة جديدة تحتوي على إجمالي الإنفاق الشهري لعام 2017 بالكامل. قم بتقريب المبالغ إلى أعداد صحيحة وطباعة القائمة.
spending_card1 = [3231.22, 3039.49, 2813.55, 2271.80, 1922.53, 2335.07]
spending_card2 = [3883.04, 3073.93, 3727.18, 2340.49, 1651.91, 1585.41, 2025.84, 3367.66, 2442.75, 2395.70, 3328.55, 3453.42]
الحل
total_spending = []
if len(spending_card1) > len(spending_card2):
longer_len = len(spending_card1)
else:
longer_len = len(spending_card2)
for i in range(longer_len):
monthly_total = 0
if i < len(spending_card1):
monthly_total += spending_card1[i]
if i < len(spending_card2):
monthly_total += spending_card2[i]
total_spending.append(round(monthly_total))
print(total_spending)
نحتاج أولاً إلى معرفة طول أطول قائمة. وهذا ما تفعله عبارة if-else
الأولى. باستخدام الدالة المضمنة len()
، يتم حفظ الطول كمتغير longer_len. ثم ننتقل عبر جميع الأعداد الصحيحة من 0 إلى longer_len-1 باستخدام الدالة المضمنة range()
. تمثل هذه الأعداد الصحيحة فهرس قوائمنا.
في أعلى الحلقة، نقوم بتعريف متغير آخر Monthly_total، وهو صفر. لدينا عبارة if
أخرى للتحقق مما إذا كان العدد الصحيح أقل من طول القوائم المعنية. إذا كان الأمر كذلك، نضيف المبلغ من أي من القائمتين expenditure_card1 أو investing_card2 أو كليهما إلى متغير Monthly_total. ثم يتم إلحاق هذا المتغير بقائمة total_spending.
يعد العمل بأكثر من قائمة في وقت واحد أمرًا شائعًا. تحتوي مقالتنا “كيفية تكرار قوائم متعددة في بايثون” على المزيد من الأمثلة التي توضح لك كيفية التعامل مع قوائم بايثون المتعددة.
التمرين 11: العمل مع القوائم داخل الدوال
اكتب دالة باسم get_long_words(input_list, min_len). تقبل الدالة قائمة من السلاسل وتعيد قائمة جديدة تحتوي فقط على كلمات لا يقل طولها عن الحد الأدنى للطول المحدد كحجة ثانية (min_len). استخدم القائمة أدناه لاختبار الدالة الخاصة بك:
sample_words = ['bird', 'carpet', 'bicycle', 'orange', 'floccinaucinihilipilification']
الحل
def get_long_words(input_list, min_len):
list_to_return = []
for i in input_list[:]:
if len(i) >= min_len:
list_to_return.append(i)
return list_to_return
التمرين 12: تعديل القوائم في الدالة
قم بإنشاء دالة تسمى get_absolute_values()
تأخذ قائمة وتعدلها بحيث يتم إعطاء جميع الأرقام كقيم مطلقة (أي التخلص من علامة الطرح للأرقام السالبة). لا تعيد أي شيء. اختبر الدالة باستخدام القائمة التالية:
absolutes = [13, -15, 42, -165, 32, -678, 1, 41]
الحل
def get_absolute_values(input_list):
for i in range(0, len(input_list)):
if input_list[i] < 0:
input_list[i] = -input_list[i]
هنا ننتقل عبر قائمة الإدخال باستخدام فهرس العناصر. باستخدام الفهرس، نختبر ما إذا كان العنصر أقل من الصفر. إذا كان الأمر كذلك، نغير علامة العنصر في القائمة الأصلية. اختبر الدالة عن طريق تشغيل:
>>> get_absolute_values(absolutes)
نظرًا لأن الدالة لا تعيد أي شيء، فستحتاج إلى استدعاء قائمة القيم المطلقة مرة أخرى للتحقق من كيفية تعديلها. في الدورة التدريبية، أظهرنا لك أيضًا كيفية القيام بنفس الشيء من خلال عدم تعديل القائمة الأصلية. من المهم فهم الاختلافات بين هاتين الحالتين.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.