مجموعات البيانات التسلسلية في Python
(Lists, Tuples )
ما هي مجموعات البيانات التي توفرها Python ..؟؟!! و ماذا نعني بالبيانات التسلسلية في بايثون..؟! و أين تصنف كل من List و Tuple بين مجموعات البيانات ..؟؟! و ما طريقة العمل مع البيانات التسلسلية من List و Tuple من خلال تعليمات Python...!!! وماهو الفرق بين مجموعات البيانات التسلسلية List و Tuple في بايثون..؟!!
في هذا المقال سنتحدث عن نوع من أنواع مجموعات البيانات في Python وهي البيانات التسلسلية في بايثون . سنتناول كيفية استخدام البيانات التسلسلية مثل list و tuple في Python، سنتعرف على طريقة إنشاء لكل من list و tuple وكيفية الوصول إلى العناصر في البيانات التسلسلية من الأنواع list و tuple ، بالإضافة إلى العديد من العمليات التي يمكن تنفيذها على البيانات التسلسلية من الأنواع list و tuple من خلال تعليمات لغة Python . لنبدأ...
في هذا المقال سنتعرف على:
- ماهي مجموعات البيانات في Python.
- البيانات التسلسلية في Sequence Types in Python.
- الدوال التي يمكن تعمل مع Tuple و List
ماهي مجموعات البيانات في Python
ذكرنا في مقال أنواع البيانات في Data Types in Python أن مجموعات البيانات هي حاويات تضم مجموعة من البيانات وتوفر Python مجموعة متنوعة من مجموعات البيانات يمكن تقسيمها الى فئات لكل فئة من هذه الفئات خصائصها Properties ودوال Methods للعمل معها وهي في Python تعبر امثلة على للـ Data Structure .و هذه الفئات التالي:
- البيانات التسلسلية Sequence types وتتمثل في list, tuple, range.
- مجموعات البيانات وتتمثل في set.
- البيانات التخطيطية Mapping types وتتمثل في dir.
في هذا المقال سنشرح ونفصل الفئة الأولى وهي البيانات التسلسلية Sequence Types في Python.
البيانات التسلسلية في Sequence Types in Python
ونعني بمجموعات البيانات التسلسلية في بايثون مجموعات البيانات التي تكون عناصرها مرتبة بشكل متسلسل و تتمثل أنوع البيانات التسلسلية في Python في عدة أشكال وهي:
لنبدأ بمناقشة كلاً من هذه الاشكال..
النطاقات Ranges
احدى الطُرق لإنتاج بيانات متسلسلة في بايثون هو استخدام الدالة range() وهي دالة مضمنة في Python تُرجع سلسلة من الأرقام الصحيحة التي تبدأ من 0 وبزيادة 1 أو أكثر حتى تصل إلى رقم محدد. بهذا تقوم الدالة range() بإنتاج نطاق معين من البيانات التسلسلية هذا النطاق يعد من نوع range class. وتعرفنا عليها في مقال سابق عن الحلقات التكرارية Loops في Python حيث استعرضنا استخدم الدالة range() مع حلقات التكرار for and while لإنشاء سلسلة من الأرقام. و فيما يلي بناء جملة range:
range (start, stop, step)
بحيث تمثل الـ Parameters التالي:
- نقطة البدء start: هو رقم صحيح لتحديد نقطة البداية للنطاق وهو اختياري ،حيث أن القيمة الافتراضية له =0 .
- نقطة التوقف stop: هو ايضاً رقم صحيح لتحديد نقطة النهاية للنطاق وهو إلزامي .
- مقدار الخطوة step: وهو رقم صحيح يمثل مقدار الانتقال للتسلسل في النطاق وهو اختاري حيث ان القيمة الافتراضية له 1 أي انتقل بمقدار مساوي 1.
لاحظ /ي طريقة إنتاج البيانات التسلسلية بواسطة الدالة range في المثال التالي :
...........
x = range(5)
for i in x: print(i) # print numbers from 0 to 4
print("--------------------")
x = range(5, 10)
for i in x: print(i) # print numbers from 5 to 9
print("--------------------")
x = range(0 ,20, 5)
for i in x: print(i) # print numbers from 5 to 20 with step jumping 5 numbers each time
print("--------------------")
print(type(x))
...........
القوائم Lists في Python
و من ضمن البيانات التسلسلية في بايثون القوائم Lists وهي أكثر أنواع البيانات المركبة تنوعًا. و تُستخدم قائمة list لتخزين عناصر متعددة في متغير واحد. و تحتوي القائمة list في Python على عناصر مفصولة بفواصل و محاطة بأقواس مربعة [ ...] . إلى حد ما ، تشبه قوائم Python المصفوفات في لغة C. ولكن الاختلاف هنا بينها في أن العناصر التي تنتمي إلى قائمة list في بايثون يمكن أن تتكون من أنواع بيانات مختلفة حيث أن المصفوفة في لغة C تخزن العناصر من نوع بيانات واحد .
عناصر القائمة List مرتبة وقابلة للتغيير وتسمح بقيم مكررة. ومرتبة تعني أن عناصر القائمة مفهرسة Indexing ، العنصر الأول بفهرس Index [0] ، العنصر الثاني به فهرس [1] ..إلخ. و مع الفهرسة Indexing التي تبدأ من 0 في بداية القائمة وتستمر في الزيادة حتى نهاية القائمة. يمكن أيضاً العمل مع الفهرسة العكسية Negative indexing التي البدء من نهاية القائمة List حيث 1- يشير إلى العنصر الأخير ، 2- يشير إلى العنصر قبل الأخير...إلخ.
وبما أن أن List تحتوي القائمة على أنواع مختلفة من البيانات فيمكن أن تكون هذه البيانات رقمية أو من الأنواع strings أو حتى Lists أو Tuples ويوضح المثال التالي طريقة إنشاء القائمة list في Python وطريقة الوصول للعناصر list في بايثون:
...........
#The list contains different types of data like numbers or strings or even lists or tuples
list = [1,2, 3, "Hi", "hello", [5,6,"OK"], (1,2,3),8 ]
print(list[7])
print(list[-1])
...........
لتكـن النتيجـة
8 8
ويمكن اقتطاع القائمة List عن طريق تحديد نطاق من عناصر القائمة وهذا بتحديد مكان بدء النطاق ومكان إنهائه. و عند تحديد النطاق، ستكون القيمة المعادة قائمة جديدة بالعناصر المحددة. ويتم هذا باستخدام عامل تشغيل [ : ] ويوضح المثال التالي الطريقة :
...........
list = [1,2, 3, "Hi", "hello", [5,6,"OK"], 8]
print(list[:3])
print(list[3:5])
...........
لتكـن النتيجـة
[1, 2, 3] ['Hi', 'hello']
خصائص القوائم Lists في Python
تتميز list بالخصائص التالية :
- الترتيب عندما نقول أن القوائم مرتبة ، فهذا يعني أن العناصر لها ترتيب محدد، ولن يتغيرهذا الترتيب فعند إضافة عناصر جديدة إلى القائمة، فسيتم وضع العناصر الجديدة في نهاية القائمة.
- تسمح بالتكرار نظرًا لأن القوائم مفهرسة، يمكن أن تحتوي القوائم على عناصر بنفس القيمة.
- القوائم lists قابلة للتغيير، مما يعني أنه يمكننا تغيير وإضافة وإزالة العناصر الموجودة في القائمة list بعد إنشائها. حيث يمكن تغيير قيمة عنصر معين أو مجموعة عناصر كما يتضح من المثال التالي :
...........
list = [1,2, 3, "Hi", "hello", [5,6,"OK"], 8]
list[1] = 4
print(list)
...........
لتكـن النتيجـة
[1, 4, 3, 'Hi', 'hello', [5, 6, 'OK'], 8]
العمليات على القوائم Lists
في بايثون مع القائمة list يمكن استخدام معامل الجمع (+) لجمع قائمتين في قائمة واحدة كما يتضح في المثال التالي:
...........
list1 = [3,4,5]
list2 = [7,8,9]
print(list1 +list2)
...........
لتكـن النتيجـة
[3, 4, 5, 7, 8, 9]
كما تتيح بايثون استخدام علامة (*) كعامل تكرار للقائمة list. حيث تكرر عناصر القائمة عدد معين من المرات كما يتضح في المثال التالي :
...........
list1 = [3,4,5]
list2 = [7,8,9]
print(list1 * 2)
print(list2 * 3)
...........
لتكـن النتيجـة
[3, 4, 5, 3, 4, 5] [7, 8, 9, 7, 8, 9, 7, 8, 9]
دوال العمل مع القوائم Lists
1- دوال إضافة العناصر القائمة List
توفر بايثون عدد من الدوال التي تعمل على إضافة العناصر الى القائمة List ولكل منها طريقة عمل ويوضح الشكل التالي:
وهنا أمثلة توضح طريقة عمل دوال إضافة العناصر إلى List في بايثون:
...........
list1 = [3, 4, 5]
list2 = [8, 7, 9]
list1.append(8)
print(list1)
list1.insert(2, 9)
print(list1)
list1.extend(list2)
print(list1)
...........
لتكـن النتيجـة
[3, 4, 5, 8] [3, 4, 9, 5, 8] [3, 4, 9, 5, 8, 8, 7, 9]
دوال لحذف العناصر من القائمة List
توفر Python عدد من الدوال التي تعمل على حذف العناصر من القائمة List ولكل منها طريقة عمل تتضح في الشكل التالي:
وهنا أمثلة على طريقة عمل دوال حذف العناصر من List في بايثون:
...........
list = [1,2, 3, "Hi", "hello", [5,6,"OK"], 8]
print(list)
list.remove(3)
print(list)
list.pop(4)
print(list)
list.pop()
print(list)
list.clear()
print(list)
del(list)
print(list)
...........
لتكـن النتيجـة
[1, 2, 3, 'Hi', 'hello', [5, 6, 'OK'], 8] [1, 2, 'Hi', 'hello', [5, 6, 'OK'], 8] [1, 2, 'Hi', 'hello', 8] [1, 2, 'Hi', 'hello'] [] <class 'list'>
مجموعة البيانات Tuples
تعبر Tuple في Python عن حاوية تضم مجموعة من البيانات التسلسلية أي مجموعة من العناصر المرتبة وغير قابلة للتغيير. وهي تمامًا مثل القوائم Lists . الاختلافات بين Tuples و Lists هي أنه لا يمكن تغيير Tuple على عكس List.
...........
tuple1 = () # an empty tuple
# tuples as lists can contain different types of data like numbers or strings or even lists or tuples
tuple12 = (1,2, 3, "Hi", "hello", [5,6,"OK"], (1,2,3), 8)
...........
و لإنشاء Tuple تحتوي على قيمة واحدة ، يجب علينا تضمين فاصلة comma ( , ) حتى لو لم توجد إلا قيمة واحدة فقط.
...........
tuple0 = (1) # integer type
print(type(tuple0))
tuple1 = (1,) # tuple type
print(type(tuple1))
...........
في Python أي مجموعة البيانات من عناصر متعددة ، مفصولة بفواصل ، مكتوبة بدون رموز تعريفية ، مثل الأقواس المربعة [..] ، والأقواس (...) ، وما إلى ذلك، افتراضيًا تصنف هذه المجموعة الى نوع Tuples ، كما هو موضح في المثال التالي:
...........
x = 'Hi', 'Welcome', 1, 2, 3, True
print(type(x)) # x is belong to the <class 'tuple'>
...........
مجموعات البيانات التسلسلية تتشابه فكما في List عناصر Tuple مفهرسة حيث تبدأ من العنصر الأول في Tuple عند 0 والثاني 1 …الخ ، كما يمكن تقطيعها تماماً مثل العمل مع List. و للوصول إلى القيم الموجودة في Tuple ، تستخدم الأقواس المربعة لإرجاع جزء من العناصر وهذا بواسطة الـ Index للحصول على القيمة المتاحة في هذا Index . على سبيل المثال :
...........
tuple = (1,2, 3, "Hi", "hello", [5,6,"OK"], 8)
print(tuple[6])
print(tuple[-1])
print(tuple[:3])
print(tuple[3:5])
...........
لتكـن النتيجـة
8 8 (1, 2, 3) ('Hi', 'hello')
أيضاً، تشترك مجموعات البيانات التسلسلية في بايثون في استخدام المعاملات (+) و (*) والمقصود هنا الجمع والتكرار ،فكما في List ايضاً تستجيب مجموعات Tuples و تكون النتيجة عبارة عن مجموعة Tuple جديدة .كما يتضح في المثال التالي:
...........
tuple1 = (3, 4, 5)
tuple2 = (7, 8, 9)
print(tuple1 + tuple2)
print(tuple1 * 2)
print(tuple2 * 3)
...........
لتكـن النتيجـة
(3, 4, 5, 7, 8, 9) (3, 4, 5, 3, 4, 5) (7, 8, 9, 7, 8, 9, 7, 8, 9)
التحديث Update Tuples
تعتبر مجموعات Tuples غير قابلة للتغيير ، مما يعني أنه لا يمكننا تغيير العناصر أو إضافتها أو إزالتها بعد إنشاء المجموعة. ولكي نتمكن من إجراء تحديث على Tuple نستخدم طريقتين:
- تُستخدم هذه الطريقة عندما نريد اضافة عناصر على Tuple وهي انشاء Tuple جديد للعناصر المراد اضافتها ثم دمجها مع Tuple الأول باستخدام المعامل (+) كما أوضحنا أعلاه .
- والطريقة الثانية هي تحويل مجموعة Tuple الى List بواسطة الدالة ()list ثم التعامل معها من خلال الدوال الخاصة بالإضافة والحذف للـ List و لإعادة المجوعة الى نوع Tuple مرة أخرى نستخدم الدالة ()tuple لنرى مثال :
...........
t = (1,2, 3, "Hi", "hello", [5,6,"OK"], 8)
y = list(t) # list() function to convert to list
y.pop()
y.insert(1,5)
t = tuple(y) # tuple() function to convert yo tuple
print(t)
...........
لتكـن النتيجـة
(1, 5, 2, 3, 'Hi', 'hello', [5, 6, 'OK'])
التفريغ Unpacking Tuples
عند إنشاء Tuple، و تعيين قيمًا لها. فإننا نقوم بما يسمى بـ "التعبئة Packing" على مجموعة Tuple ، وفي Python ، يُسمح لنا أيضًا باستخراج القيم مرة أخرى إلى متغيرات. هذا يسمى بـ "التفريغ Unpacking" لنأخذ مثال:
...........
fruits = ("Bananas", "Apples", "Grapes")
(red, yellow, green) = fruits
print(yellow)
print(red)
print(green)
...........
لتكـن النتيجـة
Apples Bananas Grapes
نلاحظ في المثال السابق تساوي عناصر Tuple مع عدد المتغيرات وهنا نذكر أنه يجب أن يتطابق عدد المتغيرات مع عدد العناصر في Tuple، وإذا لم يكن الأمر كذلك ، فيجب عليك استخدام علامة النجمة (*) لتجميع القيم المتبقية كقائمة List . وإذا كان عدد المتغيرات أقل من عدد عناصر tuple، يمكنك إضافة (*) إلى اسم المتغير وسيتم تعيين القيم إلى المتغير كقائمة list لاحظ /ي النتائج للمثال التالي:
...........
fruits = ("Bananas", "Apples", "Grapes", "Kiwis")
(red, yellow, *green) = fruits
print(yellow)
print(red)
print(green)
...........
لتكـن النتيجـة
Apples Bananas ['Grapes', 'Kiwis']
ويتم إضافة علامة النجمة إلى اسم المتغير الذي نريد تجميع القيم المتيقة إليه ، هنا ستقوم Python بتعيين هذه القيم للمتغير حتى يتطابق عدد القيم المتبقية مع عدد المتغيرات المتبقية. لاحظ / المثال التالي:
...........
fruits = ("Bananas", "Grapes", "Kiwis","Apples" )
(yellow, *green, red) = fruits
print(yellow)
print(green)
print(red)
...........
لتكـن النتيجـة
Bananas ['Grapes', 'Kiwis'] Apples
ملاحظة : تعمل خاصية التفريغ Unpacking على مجموعات البيانات التسلسلية فتعمل مع List تماماً كما تعمل مع Tuple.
الدوال التي يمكن تعمل مع Tuple و List
تتشارك مجموعات البيانات التسلسلية List و Tuple بعض الدوال التي تعمل معها ومن هذه الدوال التالي :
وهنا أمثلة على طريقة استخدام هذه دوال مجموعات البيانات التسلسلية list & tuple :
دوال المجموعات التسلسلية مع القوائم List
...........
list = [1, 2, 3, "Hi", "hello", [5,6,"OK"], (1,2,3), 8 ]
list1 = [3, 4, 5]
list2 = [8, 7, 9]
x = list.count([5,6,"OK"]) #count() returns the frequency of this item the in the list
print(x )
print("--------------------")
x = list.index([5,6,"OK"]) #Index() returns the index of this item
print(x)
print("--------------------")
myLisit = list.copy() #copy() makes a new list that copy from original list
print(myLisit)
print("--------------------")
print(len(list)) # len() for returns the number of the list's items (the list length
print("--------------------")
print(max(list2))
print("--------------------")
print(min(list2))
print("--------------------")
print(sorted(list2))
print(sorted(list2, reverse= True)
...........
لتكـن النتيجـة
1 -------------------- 5 -------------------- [1, 2, 3, 'Hi', 'hello', [5, 6, 'OK'], (1, 2, 3), 8] -------------------- 8 -------------------- 9 7 [7, 8, 9] [9, 8, 7]
دوال المجموعات التسلسلية مع Tuples
...........
tuple1 = (1,2, 3, "Hi", "hello", [5,6,"OK"], (1,2,3), 8)
tuple2 = (3, 4, 5)
tuple3 = (8, 7, 9)
print(tuple1.count("Hi"))
print("--------------------")
print(tuple1.index("Hi"))
print("--------------------")
print(len(tuple1))
print("--------------------")
print(tuple (sorted(tuple3)))
print("--------------------")
print(tuple (sorted(tuple3, reverse=True)))
print("--------------------")
print(max(tuple2))
print("--------------------")
print(min(tuple2))
...........
لتكـن النتيجـة
1 -------------------- 4 -------------------- 8 -------------------- (7, 8, 9) -------------------- (9, 8, 7) -------------------- 5 -------------------- 3
جميع الأمثلة لهذا المقال متوفرة هنا.
إلى هنا ينتهي هذا المقال الذي تكلم عن البيانات التسلسلية في لغة Python تعرفنا فيه على مفهوم البيانات التسلسلية في بايثون. وماهي أنواع البيانات التسلسلية وهما List و Tuple. عرفنا الفرق بين list و tuple في بايثون. وشرحنا بشكل مفصل كلاً من list و tuple من حيث طريقة التعريف والدوال التي تعمل معها من خلال تعليمات Python.