Lists - Learn Python 3 - Snakify

Lesson 7
قوائم


1. قوائم

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

في السابق ، واجهنا بالفعل مهمة معالجة عناصر التسلسل - على سبيل المثال ، عند حساب أكبر عنصر في التسلسل. لكننا لم نحتفظ بالتسلسل الكامل في ذاكرة الكمبيوتر. ومع ذلك ، في العديد من المشاكل ، من الضروري الاحتفاظ بالتسلسل الكامل ، كما لو أننا اضطررنا إلى طباعة جميع عناصر التسلسل بترتيب تصاعدي ("فرز تسلسل").

لتخزين مثل هذه البيانات ، في Python ، يمكنك استخدام بنية البيانات المسماة list (في معظم لغات البرمجة يتم استخدام المصطلح المختلف - "array"). القائمة عبارة عن سلسلة من العناصر مرقمة من 0 ، تمامًا كأحرف في السلسلة. يمكن تعيين القائمة يدويًا من خلال تعداد العناصر القائمة الموجودة بين أقواس مربعة ، مثل هنا:

Primes = [2, 3, 5, 7, 11, 13]
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']

تحتوي قائمة Primes على 6 عناصر وهي: Primes[0] == 2 ، Primes[1] == 3 ، Primes[2] == 5 ، Primes[3] == 7 ، Primes[4] == 11 ، Primes[5] == 13 . تحتوي قائمة Rainbow على 7 عناصر ، كل منها عبارة عن السلسلة.

مثل الأحرف في السلسلة ، يمكن أن تحتوي عناصر القائمة أيضًا على فهرس سالب ، على سبيل المثال ، Primes[-1] == 13 ، Primes[-6] == 2 . يعني المؤشر السالب أننا نبدأ في العنصر الأخير ونذهب إلى اليسار عند قراءة القائمة.

يمكنك الحصول على عدد العناصر في القائمة باستخدام الدالة len (بمعنى طول القائمة ) ، على سبيل المثال len(Primes) == 6 .

على عكس السلاسل ، فإن عناصر القائمة قابلة للتغيير ؛ يمكن تغييرها عن طريق تعيين قيم جديدة لها.

Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
print(Rainbow[0])
Rainbow[0] = 'red'
print('Print the rainbow')
for i in range(len(Rainbow)):
    print(Rainbow[i])

النظر في عدة طرق لإنشاء وقراءة القوائم. بادئ ذي بدء ، يمكنك إنشاء قائمة فارغة (القائمة مع عدم وجود عناصر ، طوله هو 0) ، ويمكنك إضافة عناصر إلى نهاية قائمتك باستخدام append . على سبيل المثال ، لنفترض أن البرنامج يتلقى عدد العناصر في القائمة n ، ثم n عناصر من القائمة واحدة تلو الأخرى في كل سطر منفصل. في ما يلي مثال على بيانات الإدخال بهذا التنسيق:

5
1809
1854
1860
1891
1925
في هذه الحالة ، يمكنك تنظيم القراءة من هذه القائمة كما يلي:
a = [] # بدء قائمة فارغة
n = int(input()) # قراءة عدد عنصر في القائمة
for i in range(n): 
    new_element = int(input()) # قراءة العنصر التالي
    a.append(new_element) # إضافته إلى القائمة
    # يمكن استبدال السطرين الأخيرين بواحد:
    # a.append (كثافة العمليات (المدخلات ()))
print(a)

في المثال الذي تم عرضه يتم إنشاء القائمة الفارغة ، ثم يتم قراءة عدد العناصر ، ثم تقرأ عناصر القائمة سطرًا سطرًا وتضاف إلى النهاية. نفس الشيء يمكن عمله ، حفظ المتغير n :

a = []
for i in range(int(input())):
    a.append(int(input()))
print(a)

هناك العديد من العمليات المحددة للقوائم: قائمة التسلسل (إضافة القوائم ، أي "اللصق" إلى قائمة أخرى) والتكرار (ضرب قائمة بأحد الأرقام). فمثلا:

a = [1, 2, 3]
b = [4, 5]
c = a + b
d = b * 3
print([7, 8] + [9])
print([0, 1] * 3)

ستكون القائمة الناتجة c مساوية لـ [1, 2, 3, 4, 5] ، وستكون قائمة d تساوي [4, 5, 4, 5, 4, 5] . هذا يسمح لك بتنظيم عملية قراءة القوائم بشكل مختلف: أولاً ، ضع في اعتبارك حجم القائمة وقم بإنشاء قائمة من العدد المطلوب للعناصر ، ثم قم بالتكرار من خلال المتغير i يبدأ بالرقم 0 وداخل الحلقة i -th element من القائمة:

a = [0] * int(input())
for i in range(len(a)):
    a[i] = int(input())

يمكنك طباعة عناصر من قائمة a مع print(a) ؛ هذا يعرض عناصر القائمة محاطة بأقواس مربعة مفصولة بفواصل. بشكل عام ، هذا غير مريح. بشكل عام ، أنت على وشك طباعة جميع العناصر في سطر واحد أو عنصر واحد في كل سطر. إليك مثالان على ذلك ، باستخدام نماذج أخرى من الحلقات:

a = [1, 2, 3, 4, 5]
for i in range(len(a)):
    print(a[i])

هنا يتم تغيير المؤشر i ، ثم يتم عرض العنصر a[i] .

a = [1, 2, 3, 4, 5]
for elem in a:
    print(elem, end=' ')

في هذا المثال ، يتم عرض عناصر القائمة في سطر واحد مفصولة بمسافات ، وليست هي الفهرس الذي تم تغييره ولكن بدلاً من ذلك قيمة المتغير نفسه (على سبيل المثال ، في الحلقة for elem in ['red', 'green', 'blue'] elem متغير سوف يأخذ القيم 'red' ، 'green' ، 'blue' التوالي.

انتبه بشكل خاص إلى المثال الأخير! جزء مهم جدا من بيثون أيديولوجية غير for حلقة، والذي يوفر طريقة ملائمة لتكرار عبر جميع عناصر بعض تسلسل. هذا هو المكان الذي يختلف بيثون من باسكال، حيث لديك لتكرار عبر الفهارس العناصر، ولكن ليس على العناصر نفسها.

التسلسلات في Python هي سلاسل ، قوائم ، قيم range() الدوال range() (هذه ليست قوائم) ، وبعض الكائنات الأخرى.

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

# المعطى: s = 'ab12c59p7dq'
# تحتاج إلى استخراج أرقام من القائمة
# لجعله هكذا:
# الأرقام == [1 ، 2 ، 5 ، 9 ، 7]
s = 'ab12c59p7dq'
digits = []
for symbol in s:
    if '1234567890'.find(symbol) != -1:
        digits.append(int(symbol))
print(digits)
Advertising by Google, may be based on your interests

2. انقسام وطرق الانضمام

يمكن إعطاء عناصر القائمة في سطر واحد مفصولة بحرف؛ في هذه الحالة ، يمكن قراءة القائمة بأكملها باستخدام input() . يمكنك بعد ذلك استخدام طريقة split() السلسلة split() ، والتي تقوم بإرجاع قائمة السلاسل الناتجة بعد قطع السلسلة الأولية بمسافات. مثال:

# المدخلات هي سلسلة
# 1 2 3
s = input() # s == '1 2 3'
a = s.split() # a == ['1'، '2'، '3']
print(a)

إذا قمت بتشغيل هذا البرنامج مع بيانات الإدخال من 1 2 3 ، فستكون القائمة a مساوية لـ ['1', '2', '3'] . يرجى ملاحظة أن القائمة تتكون من سلاسل ، وليس أرقام. إذا كنت ترغب في الحصول على قائمة الأرقام ، يجب عليك تحويل عناصر القائمة واحدة تلو الأخرى إلى الأعداد الصحيحة:

a = input().split()
for i in range(len(a)):
    a[i] = int(a[i])
print(a)

باستخدام السحر الخاص لمولدات بايثون - نفس الشيء يمكن القيام به في سطر واحد:

a = [int(s) for s in input().split()]
print(a)

(سنشرح كيفية عمل هذه التعليمة البرمجية في القسم التالي). إذا كنت تريد قراءة قائمة بالأرقام الحقيقية ، فيجب عليك تغيير نوع int ليتم float .

يحتوي أسلوب split() على معلمة اختيارية تحدد السلسلة التي سيتم استخدامها كفاصل بين عناصر القائمة. على سبيل المثال ، استدعاء الأسلوب split('.') بإرجاع القائمة التي تم الحصول عليها عن طريق تقسيم السلسلة الأولية حيث الحرف '.' واجه:

a = '192.168.0.1'.split('.')
print(a)

في Python ، يمكنك عرض قائمة من السلاسل باستخدام أوامر سطر واحد. لذلك، وطريقة join يستخدم. هذه الطريقة لها معلمة واحدة: قائمة من السلاسل. تقوم بإرجاع السلسلة التي تم الحصول عليها بواسطة تجميع العناصر المعطاة ، ويتم إدخال الفاصل بين عناصر القائمة ؛ هذا الفاصل يساوي السلسلة التي يتم تطبيق الأسلوب. نحن نعلم أنك لم تفهم الجملة السابقة من المرة الأولى. :) انظر إلى الامثله:

a = ['red', 'green', 'blue']
print(' '.join(a))
# العودة أحمر أخضر أزرق
print(''.join(a))
# العودة redgreenblue
print('***'.join(a))
# يعود أحمر *** أخضر *** أزرق

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

a = [1, 2, 3]
print(' '.join([str(i) for i in a]))
# السطر التالي يسبب خطأ في الكتابة ،
# كما join () يمكن فقط إنشاء strs
# print ('' .join (a))

ومع ذلك، إذا كنت لست من محبي السحر المظلمة، يمكنك تحقيق نفس التأثير باستخدام حلقة for .

Advertising by Google, may be based on your interests

3. مولدات كهرباء

لإنشاء قائمة تملؤها عناصر متطابقة ، يمكنك استخدام تكرار القائمة ، على سبيل المثال:

n = 5
a = [0] * n
print(a)

لإنشاء قوائم أكثر تعقيدًا ، يمكنك استخدام المولدات : التعبيرات التي تسمح بملء قائمة وفقًا لصيغة. الشكل العام للمولد هو كما يلي:

[expression for variable in sequence]

حيث أن variable هو معرف لبعض المتغيرات ، sequence هو سلسلة من القيم ، والتي تأخذ المتغير (هذا يمكن أن يكون قائمة ، سلسلة ، أو كائن تم الحصول عليه باستخدام range الدوال) ، expression - بعض التعبير ، عادة يعتمد على المتغير تستخدم في المولد. سيتم ملء عناصر القائمة وفقًا لهذا التعبير.

فيما يلي بعض الأمثلة على الأشخاص الذين يستخدمون المولدات.

هذه هي الطريقة التي تنشئ بها قائمة من الأصفار n باستخدام المولد:

a = [0 for i in range(5)]
print(a)

فيما يلي كيفية إنشاء قائمة مليئة بمربعات أعداد صحيحة:

n = 5
a = [i ** 2 for i in range(n)]
print(a)

إذا كنت بحاجة إلى ملء قائمة بمربعات الأرقام من 1 إلى n ، فيمكنك تغيير إعدادات range إلى range(1, n + 1) :

n = 5
a = [i ** 2 for i in range(1, n + 1)]
print(a)

فيما يلي كيفية الحصول على قائمة مليئة بأرقام عشوائية من 1 إلى 9 (باستخدام randrange من الوحدة النمطية random ):

from random import randrange
n = 10
a = [randrange(1, 10) for i in range(n)]
print(a)

وفي هذا المثال ستتكون القائمة من سطور القراءة من الإدخال القياسي: أولاً ، ستحتاج إلى إدخال عدد عناصر القائمة (سيتم استخدام هذه القيمة كوسيطة range الدوال) ، ثانيًا - هذا العدد من السلاسل:

a = [input() for i in range(int(input()))]
print(a)
Advertising by Google, may be based on your interests

4. شرائح

باستخدام القوائم والسلاسل ، يمكنك عمل الشرائح. وهي:

A[i:j] slice ji elements A[i] ، A[i+1] ، ...، A[j-1] .

A[i:j:-1] عناصر ij شريحة A[i] ، A[i-1] ، ... ، A[j+1] (أي تغيير ترتيب العناصر).

A[i:j:k] cut with the step k : A[i] ، A[i+k] ، A[i+2*k] ، .... إذا كانت قيمة k <0 ، فإن العناصر تأتي بترتيب معاكس.

قد يكون كل رقم من الأرقام i أو j مفقودًا ، ما يعني "بداية السطر" أو "نهاية السطر"

القوائم ، على عكس السلاسل ، هي كائنات قابلة للتغيير : يمكنك تعيين عنصر قائمة إلى قيمة جديدة. علاوة على ذلك ، من الممكن تغيير شرائح كاملة. فمثلا:

A = [1, 2, 3, 4, 5]
A[2:4] = [7, 8, 9]
print(A)

هنا تلقينا قائمة [1, 2, 3, 4, 5] ، ثم حاول استبدال عنصرين من الشريحة A[2:4] بقائمة جديدة من ثلاثة عناصر. القائمة الناتجة هي كما يلي: [1, 2, 7, 8, 9, 5] .

A = [1, 2, 3, 4, 5, 6, 7]
A[::-2] = [10, 20, 30, 40]
print(A)

وهنا ، ستكون القائمة الناتجة [40, 2, 30, 4, 20, 6, 10] . والسبب هو ، A[::-2] هي قائمة من العناصر A[-1] ، A[-3] ، A[-5] ، A[-7] ، ويتم تعيين تلك العناصر إلى 10 ، 20 ، 30 و 40 على التوالي.

إذا تم تعيين شريحة غير متصلة (أي شريحة مع خطوة k ، k > 1 ) قيمة جديدة ، فإن عدد العناصر في الشرائح القديمة والجديدة يتطابق بالضرورة ، وإلا يحدث خطأ ValueError .

لاحظ أن A[i] هي عنصر قائمة ، وليست شريحة!

Advertising by Google, may be based on your interests

5. العمليات على القوائم

يمكنك بسهولة القيام بالعديد من العمليات المختلفة مع القوائم.

س في أ
تحقق ما إذا كان عنصر في القائمة. ترجح صواب أو خطأ
س لا في A
نفس الشيء ليس (س في A)
دقيقة (A)
أصغر عنصر في القائمة
ماكس (A)
أكبر عنصر في القائمة
A.index (خ)
مؤشر التواجد الأول للعنصر x في القائمة ؛ في غيابه يولد استثناء ValueError
A.count (خ)
عدد مرات ظهور العنصر x في القائمة
Advertising by Google, may be based on your interests