قوائم متداخلة

9.4 قوائم متداخلة

أهداف التعلم

في نهاية هذا القسم، ينبغي أن تكون قادرًا على:

  • إظهار استخدام قائمة من قوائم لتنظيم البيانات.
  • إظهار الوصول إلى العناصر الفردية باستخدام الفهرسة ذات الأبعاد المتعددة.
  • استخدام حلقات متداخلة للتكرار على قائمة من قوائم.

قائمة من قوائم

يمكن أن تتكون القوائم من أي نوع من العناصر. يمكن أن يكون عنصر القائمة أيضًا قائمة. مثال: [2, [3, 5], 17] هي قائمة صالحة، إذ تشغل القائمة [3, 5] الموضعَ ذا الفهرس 1.

عندما تكون القائمة عنصرًا داخل قائمة أكبر، تُسمّى قائمة متداخلة (nested list). القوائم المتداخلة مفيدة للتعبير عن البيانات متعددة الأبعاد. عندما يكون كل عنصر من عناصر القائمة الأكبر قائمةً أصغر، تُسمى القائمة الأكبر قائمة من قوائم (list-of-lists).

مثال: يمكن تخزين جدول في صورة قائمة من قوائم ثنائية البُعد، إذ يمثل كل صف من البيانات قائمةً داخلها.

نقطة تحقق

قائمة من قوائم

مفاهيم تطبيقية

القوائم

لكل سؤال من الأسئلة أدناه، استعن بالمصفوفة التالية:


mat A= 7 4 5 3 9 6 1 2 8 mat A= 7 4 5 3 9 6 1 2 8
1.
ما الطريقة الصحيحة لتمثيل matA في بايثون؟
  1. [[7, 4, 5], [3, 9, 6], [1, 2, 8]]
  2. [7, 4, 5
    3, 9, 6
    1, 2, 8]
  3. [[7, 3, 1], [4, 9, 2], [1, 2, 8]
2.
ما الفهرس الصحيح للرقم 6 في القائمة أعلاه؟
  1. [5]
  2. [2][1]
  3. [1][2]
3.
ماذا ستكون نتيجة الشِفرة التالية:
  print(matA[0])
  1. Error
  2. 7
  3. [7, 4, 5]

استخدام حلقات متداخلة للتكرار على قوائم متداخلة

يمكن استخدام بنية حلقة متداخلة للتكرار على قائمة من قوائم. بالنسبة لقائمة من قوائم ثنائية الأبعاد، يمكن استخدام حلقة التكرار المحدد الخارجية للصفوف، وحلقة التكرار المحدد الداخلية للأعمدة.

مثال 9.4

التكرار على قائمة من قوائم

توضح الشِفرة أدناه كيفية التكرار على قائمة من قوائم.

تمر الحلقة الخارجية في السطر 9 على عناصر القائمة الأكبر واحدًا تلو الآخر. كل عنصر في القائمة الأكبر هو قائمة. وتمر الحلقة الداخلية في السطر 10 على كل عنصر في كل قائمة متداخلة.

1
"""Iterating a list-of-lists."""
2
3
# إنشاء قائمة أعداد
4
list1 = [[1, 2, 3],
5
        [1, 4, 9],
6
        [1, 8, 27]]
7
8
# التكرار على قائمة من قوائم
9
for row in list1:
10
  for num in row:
11
    print(num, end=" ")
12
  print()

ناتج الشِفرة أعلاه:

    1 2 3
    1 4 9
    1 8 27

مفاهيم تطبيقية

التكرار على قائمة من قوائم

لكل سؤال أدناه، استعن بالقائمة التالية:

my_list = [[7, 4, 5, 12],
          [24, 3, 9, 16],
          [12, 8, 91, -5]]
4.
أي شِفرة تطبع كل رقم في my_list بدءًا من 7، ثم 4، وهكذا حتى -5؟
  1. for row in my_list:
      for elem in row:
        print(elem)
    
  2. for elem in my_list:
        print(elem)
    
5.
يمكن أيضًا استخدام الدالّة range() للتكرار على قائمة من قوائم. أي شِفرة تطبع كل رقم في my_list بدءًا من 7، ثم 4، وهكذا حتى -5، باستخدام حلقات التكرار المحدد العدّية؟
  1. for column_index in range(0, len(my_list[0])):
      for row_index in range (0, len(my_list)):
        print(my_list[row_index][column_index])
    
  2. for row_index in range(0, len(my_list)):
      for column_index in range (0, len(my_list)):
        print(my_list[row_index][column_index])
      print()
    
  3. for row_index in range(0, len(my_list)):
      for column_index in range (0, len(my_list[0])):
        print(my_list[row_index][column_index])
    

جرّب بنفسك

ضرب المصفوفات

اكتب برنامجًا يحسب ناتج ضرب المصفوفات matW و matZ أدناه ويطبع النتيجة. النتيجة المتوقعة موضحة.

mat W= 13 4 5 2 −9 7 7 3 19 mat Z= 2 1 5 3 7 9 −1 13 19 mat W= 13 4 5 2 −9 7 7 3 19 mat Z= 2 1 5 3 7 9 −1 13 19
result= 33 106 196 −30 30 62 4 275 423 result= 33 106 196 −30 30 62 4 275 423

في مصفوفة النتيجة، يُحسب كل عنصر وفقًا لموقع العنصر. تُحسب النتيجة في الموضع [i][j] باستخدام الصف i من المصفوفة الأولى، W، والعمود j من المصفوفة الثانية، Z.

مثال:

result[1][2] = (الصف 1 في W) مضروبًا في (العمود 2 في Z)

result[1][2]= 2 -9 7 * 5 9 19 result[1][2]= 2 -9 7 * 5 9 19


result[1][2]=2*5+(-9)*9+7*19=10-81+133=62 result[1][2]=2*5+(-9)*9+7*19=10-81+133=62