المصفوفة list هي مجموعة قابلة للتعديل من العناصر في تسلسل.
ومثل معظم المجموعات (انظر الأنواع المدمجة tuple وdict وset)، يمكن للمصفوفات أن تحمل مراجع إلى أي نوع من أنواع البيانات (أو عدة أنواع)، بما في ذلك مصفوفات أخرى.
ويمكن نسخ المصفوفات كاملة أو جزئيًا عبر تدوين الشرائح أو باستخدام <list>.copy().
وكأي تسلسل، يُشار إلى العناصر داخل lists برقم 0-based index من اليسار، أو برقم -1-based index من اليمين.
تدعم المصفوفات كلاً من عمليات التسلسل الشائعة والقابلة للتعديل، مثل min(<list>)/max(<list>) و<list>.index() و<list>.append() و<list>.reverse().
ويمكن تكرار العناصر داخل list باستخدام التركيب for item in <list>.
ويمكن استخدام for index, item in enumerate(<list>) عندما تكون هناك حاجة إلى كل من فهرس العنصر وقيمته.
كما توفر Python أيضًا العديد من طرق المصفوفات المفيدة للتعامل مع المصفوفات.
وفيما يلي تغطية لمجموعة مختارة من هذه list methods.
لاحظ أنه عند التعامل مع list باستخدام list-method، فإنك تُغيّر المصفوفة التي تم تمريرها.
وإذا كنت لا ترغب في تعديل list الأصلية، فستحتاج على الأقل إلى إنشاء shallow copy منها عبر الشرائح أو <list>.copy().
لإضافة عنصر إلى نهاية مصفوفة موجودة أو إلى "الجانب الأيمن" منها، استخدم <list>.append(<item>):
>>> numbers = [1, 2, 3]
>>> numbers.append(9)
>>> numbers
[1, 2, 3, 9]
وبدلًا من الإلحاق، تمنحك <list>.insert() القدرة على إضافة العنصر إلى فهرس محدد في المصفوفة.
وهي تأخذ معاملَين:
<index> الذي تريد إدراج العنصر عنده.<item> المراد إدراجه.ملاحظة: إذا كان index المعطى هو 0، فسيُضاف العنصر إلى بداية list، أي "الجانب الأيسر" منها.
وإذا كان index الممرَّر أكبر من index الأخير في list، فسيُضاف العنصر في الموضع الأخير، وهو ما يعادل استخدام <list>.append(<item>).
>>> numbers = [1, 2, 3]
>>> numbers.insert(0, -2)
>>> numbers
[-2, 1, 2, 3]
>>> numbers.insert(1, 0)
>>> numbers
[-2, 0, 1, 2, 3]
يمكن استخدام <list>.extend(<item>) لدمج مصفوفة موجودة مع عناصر كائن قابل للتكرار آخر (على سبيل المثال set أو tuple أو str أو list).
يتم تفكيك الكائن القابل للتكرار وتُضاف عناصره بالترتيب (استخدام <list>.append(<item>) في هذه الحالة سيضيف الكائن القابل للتكرار بأكمله كـعنصر واحد).
>>> numbers = [1, 2, 3]
>>> other_numbers = [5, 6, 7]
>>> numbers.extend(other_numbers)
>>> numbers
[1, 2, 3, 5, 6, 7]
>>> numbers.extend([8, 9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9]
>>> numbers.append([8,9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9, [8, 9]]
لحذف عنصر من مصفوفة، استخدم <list>.remove(<item>)، مع تمرير العنصر المراد حذفه كوسيط.
وستُطلق <list>.remove(<item>) خطأ ValueError إذا لم يكن العنصر موجودًا في list.
>>> numbers = [1, 2, 3]
>>> numbers.remove(2)
>>> numbers
[1, 3]
# Trying to remove a value that is not in the list throws a ValueError
>>> numbers.remove(0)
ValueError: list.remove(x): x not in list
وبدلًا من ذلك، سيؤدي استخدام طريقة <list>.pop(<index>) إلى حذف العنصر وreturnه لاستخدامه.
تأخذ <list>.pop(<index>) معاملًا اختياريًا واحدًا: وهو index العنصر المراد حذفه وإرجاعه.
وإذا لم يُحدَّد وسيط index (الاختياري)، فسيُحذف العنصر الأخير من list ويُرجَع.
وإذا كان index المحدد أكبر من index العنصر الأخير، فسيُرفع IndexError.
>>> numbers = [1, 2, 3]
>>> numbers.pop(0)
1
>>> numbers
[2, 3]
>>> numbers.pop()
3
>>> numbers
[2]
>>> numbers.pop(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
يمكن حذف جميع العناصر من list باستخدام list.clear(). وهي لا تأخذ أي معاملات.
>>> numbers = [1, 2, 3]
>>> numbers.clear()
>>> numbers
[]
ستعكس طريقة <list>.reverse() ترتيب العناصر في مكانها.
>>> numbers = [1, 2, 3]
>>> numbers.reverse()
>>> numbers
[3, 2, 1]
ويمكن إعادة ترتيب المصفوفة في مكانها بمساعدة <list>.sort().
الترتيب الافتراضي للفرز هو ترتيب تصاعدي من اليسار.
وتقدم وثائق Python نصائح وتقنيات إضافية للترتيب.
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
# The default sort order is *ascending*.
>>> names.sort()
>>> names
["Bruce", "Natasha", "Thor", "Tony"]
إذا أردت ترتيبًا تنازليًا، فمرّر الوسيط reverse=True:
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> names.sort(reverse=True)
>>> names
["Tony", "Thor", "Natasha", "Bruce"]
وفي الحالات التي لا يُستحسن فيها تعديل المصفوفة الأصلية، يمكن استخدام الدالة المدمجة sorted(<iterable>) لإرجاع نسخة مرتبة.
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> sorted(names)
['Bruce', 'Natasha', 'Thor', 'Tony']
يمكن حساب عدد مرات ظهور عنصر في مصفوفة بمساعدة list.count(<item>).
وهي تأخذ item المراد عدّه كوسيط لها، وتُرجع العدد الإجمالي لمرات ظهور ذلك العنصر في list.
>>> items = [1, 4, 7, 8, 2, 9, 2, 1, 1, 0, 4, 3]
>>> items.count(1)
3
ستُرجع <list>.index(<item>) رقم index الخاص بـ_أول ظهور_ لعنصر يُمرَّر إليها.
وإذا لم يكن هناك أي ظهور، فسيُرفع ValueError.
وإذا لم تكن بحاجة إلى الموضع الدقيق لعنصر ما، فإن العامل المدمج in أكثر كفاءة للتحقق مما إذا كانت المصفوفة تحتوي على قيمة معينة.
تبدأ الفهرسة من الصفر من اليسار، لذا فإن موضع العنصر "الأول" هو 0.
كما تعمل الفهرسة من اليمين أيضًا، بدءًا من -1.
>>> items = [7, 4, 1, 0, 2, 5]
>>> items.index(4)
1
>>> items.index(10)
ValueError: 10 is not in list
ويمكن أيضًا تمرير فهرسي start وend لتضييق البحث على قسم محدد من list:
>>> names = ["Tina", "Leo", "Thomas", "Tina", "Emily", "Justin"]
>>> names.index("Tina")
0
>>> names.index("Tina", 2, 5)
3
تمتلك Chaitana مدينة ملاهٍ شهيرة جدًا. ولديها لعبة واحدة فقط في وسط حدائق منسّقة بشكل جميل: أكبر أفعوانية في العالم (TM). وعلى الرغم من وجود هذا المعلم الوحيد فقط، يسافر الناس من كل أنحاء العالم ويقفون في الطابور لساعات من أجل فرصة ركوب أفعوانية Chaitana الفائقة.
هناك طابوران لهذه اللعبة، كلٌّ منهما ممثَّل على هيئة list:
طُلب منك كتابة بعض الكود لإدارة ضيوف المدينة بشكل أفضل. وعليك تنفيذ الدوال التالية في أسرع وقت ممكن قبل أن يتذمر الضيوف (ورئيسك في العمل، Chaitana!). احرص على القراءة بعناية. بعض المهام تطلب منك تغيير الطابور الحالي أو تحديثه، بينما تطلب أخرى منك إنشاء نسخة منه.
عرّف الدالة add_me_to_the_queue() التي تأخذ 4 معاملات <express_queue>, <normal_queue>, <ticket_type>, <person_name> وتُرجع الطابور المناسب بعد تحديثه باسم الشخص.
<ticket_type> قيمة من النوع int حيث 1 == express_queue و 0 == normal_queue.<person_name> هو اسم الشخص (من النوع str) الذي سيُضاف إلى الطابور المعني.>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=1, person_name="RichieRich")
...
["Tony", "Bruce", "RichieRich"]
>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=0, person_name="HawkEye")
....
["RobotGuy", "WW", "HawkEye"]
وصل شخص متأخرًا إلى مدينة الملاهي لكنه يريد الانضمام إلى الطابور الذي ينتظر فيه أصدقاؤه. لكنه لا يملك أي فكرة عن المكان الذي يقف فيه أصدقاؤه، ولا توجد أي تغطية هاتفية للاتصال بهم.
عرّف الدالة find_my_friend() التي تأخذ معاملَين queue و friend_name وتُرجع موضع اسم الشخص في الطابور.
<queue> هو list الأشخاص الواقفين في الطابور.<friend_name> هو اسم الصديق الذي تحتاج إلى إيجاد فهرسه (موضعه في الطابور).تذكّر: يبدأ الفهرس من 0 من اليسار، ومن -1 من اليمين.
>>> find_my_friend(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], friend_name="Steve")
...
1
الآن بعد أن عُثر على أصدقائه (في المهمة رقم 2 أعلاه)، يريد المتأخر الانضمام إليهم في موضعهم في الطابور. عرّف الدالة add_me_with_my_friends() التي تأخذ 3 معاملات queue وindex وperson_name.
<queue> هو list الأشخاص الواقفين في الطابور.<index> هو الموضع الذي ينبغي إضافة الشخص الجديد فيه.<person_name> هو اسم الشخص الذي سيُضاف في موضع الفهرس.أرجِع الطابور بعد تحديثه باسم المتأخر.
>>> add_me_with_my_friends(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], index=1, person_name="Bucky")
...
["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]
سمعت للتو من الطابور أن هناك شخصًا سيئًا حقًا يدفع ويصرخ ويثير المشاكل. عليك طرد ذلك المفسد بسبب سلوكه السيئ!
عرّف الدالة remove_the_mean_person() التي تأخذ معاملَين queue و person_name.
<queue> هو list الأشخاص الواقفين في الطابور.<person_name> هو اسم الشخص الذي يجب طرده.أرجِع الطابور بعد تحديثه بدون اسم الشخص السيئ.
>>> remove_the_mean_person(queue=["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], person_name="Eltran")
...
["Natasha", "Steve", "Wanda", "Rocket"]
قد لا تكون قد رأيت شخصين لا تربطهما قرابة ويتشابهان تمامًا في الشكل، لكنك بالتأكيد رأيت أشخاصًا لا تربطهم قرابة يحملون الاسم نفسه تمامًا (أصحاب الاسم نفسه)! اليوم، يبدو أن هناك الكثير منهم بين الحاضرين. تريد أن تعرف عدد المرات التي يظهر فيها اسم معيّن في الطابور.
عرّف الدالة how_many_namefellows() التي تأخذ معاملَين queue و person_name.
<queue> هو list الأشخاص الواقفين في الطابور.<person_name> هو الاسم الذي تعتقد أنه قد يظهر أكثر من مرة في الطابور.أرجِع عدد مرات ظهور person_name كقيمة من النوع int.
>>> how_many_namefellows(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"], person_name="Natasha")
...
2
للأسف، مدينة الملاهي مزدحمة جدًا اليوم، وعليك إزالة الشخص الأخير في الطابور العادي (ستمنحه قسيمة للعودة في المسار السريع في يوم آخر). عليك تعريف الدالة remove_the_last_person() التي تأخذ معاملًا واحدًا queue، وهي مصفوفة الأشخاص الواقفين في الطابور.
ينبغي أن تحدّث list وأن return اسم الشخص الذي أُزيل أيضًا، حتى تتمكن من كتابة قسيمة له.
>>> remove_the_last_person(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
'Rocket'
لأغراض إدارية، تحتاج إلى ترتيب كل الأسماء في طابور معيّن ترتيبًا أبجديًا.
عرّف الدالة sorted_names() التي تأخذ وسيطًا واحدًا هو queue (وهي list الأشخاص الواقفين في الطابور)، وتُرجع نسخة sorted من list.
>>> sorted_names(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.