البيانات التخطيطية Mapping types في Python
القواميس Dictionaries
ماهي القواميس Dictionaries في لغة Python…؟؟ كيف يتم انشاء القواميس Dictionaries في بايثون..؟؟!! ماهي خصائص القواميس في بايثون..؟!! و ماهي الدوال التي توفرها بايثون للعمل مع القواميس Dictionaries..؟!! كيف تعمل القواميس Dictionaries مع حلقة التكرار for..؟! وماهي القواميس المتداخلة Nested Dictionaries…!!!
تعتبر القواميس Dictionaries من أهم الأدوات في لغة بايثون، حيث توفر وسيلة سهلة وفعالة لتخزين وإدارة البيانات. في هذا المقال سنتحدث عن نوع من أنواع مجموعات البيانات في Python وهي البيانات التخطيطية Mapping types والتي تُمثل في Python بـ القواميس Dictionaries فماطُرق التعامل معها من خلال تعليمات لغة Python…
في هذا المقال نتعرف على:
- البيانات التخطيطية Mapping Types.
- القواميس Dictionaries في Python.
- إنشاء القواميس Dictionaries في Python.
- الوصول للعناصر في Dictionary.
- خصائص القواميس Dictionaries في Python.
- دوال العمل مع Dictionary في Python.
- الـ Dictionary وحلقة التكرار for.
- القواميس المتداخلة Nested Dictionaries.
- استخدام القواميس Dictionaries في Python.
ماهي مجموعات البيانات في Python
ذكرنا في مقال أنواع البيانات في Data Types in Python أن مجموعات البيانات هي حاويات تضم مجموعة من البيانات وتوفر Python مجموعة متنوعة من مجموعات البيانات يمكن تقسيمها الى فئات لكل فئة من هذه الفئات خصائصها Properties ودوال للعمل معها وهي في Python تعبر عن الـ Data Structure .و هذه الفئات التالي:
- البيانات التسلسلية Sequence types وتتمثل في list, tuple, range.
- مجموعات البيانات Set types وتتمثل في set.
- البيانات التخطيطية Mapping types وتتمثل في dir.
في هذا المقال سنشرح ونفصل الفئة الثالثة وهي مجموعات البيانات التخطيطية Mapping types والتي تتمثل في القواميس Dictionaries في بايثون.
البيانات التخطيطية Mapping Types
مجموعات البيانات التخطيطية Mapping types هي مجموعات تتكون عناصرها من أزواج مرتبطة كل زوج منها يحتوي على قيمة Value هي قيمة العنصر ومفتاح Key وهو مؤشر يؤشر إلى قيمة العنصر فهو مرتبط بالقيمة بحيث يمكن الوصول إلى قيم العناصر من خلال المفتاح الخاص لكل قيمة . ويمثل هذا النوع من مجموعة البيانات في Python القواميس Dictionaries وهو نوع من البيانات ينتمي الى dir type و توفر Python المكتبات:
- collections.defaultdict للمجموعات غير المرتبة فعند اضافة عنصر جديد يضاف بشكل عشوائي .
- وcollections.OrderedDict للمجموعات المرتبة وفيها يتم ترتيب العناصر عن الإضافة .
ويستخدم المصطلح Dictionary للإشارة الى هذه الانواع من مجموعات البيانات سواء المرتبة أو لا . وهذا لأنه اعتبارًا من الإصدار 3.7 من Python ، تم ترتيب القواميس Dictionaries , لان في Python 3.6 والإصدارات الأقدم ،كانت القواميس غير مرتبة.
القواميس Dictionaries في Python
عندما نريد تعريف الـ Dictionaries في Python يمكن القول انها مجوعات بيانات تنتمي إلى نوع البيانات dir class وتمثل بمجموعة عناصر مرتبة مكونة من أزواج مفتاح و قيمة للعنصر، هذه العناصر يمكن أن تكون مفاتيحها عبارة عن Objects غير قابلة للتغيير وقيمها Objects تشير إلى Objects من أي نوع من أنواع البيانات.
بشكل عام، تعرف القواميس Dictionaries في بايثون على أنها هيكل بيانات يتكون من مفاتيح (keys) وقيم (values)، حيث يتم تخزين القيم بناءً على المفاتيح التي يتم الوصول إليها بها.
ويمكن أيضاً تعريف القواميس Dictionaries في Python على انها تطبيق لهيكل البيانات الذي يُعرف عمومًا بالمصفوفة الترابطية Associative array. و يتكون القاموس Dictionary من مجموعة من العناصر هذه العناصر عبارة عن أزواج من المفاتيح Keys والقيم Values ، ويعني أن كل عنصر مكون من زوج من مفتاح وقيمة أن هاذين المفتاح و القيمة مرتبطين مع بعضهما البعض وهما معاً يمثلان عنصر واحد.
تعتبر القواميس Dictionaries في بايثون مرنة جدًا، حيث يمكن استخدامها لحفظ مختلف أنواع البيانات، مثل النصوص والأرقام والقوائم وحتى الأشياء المعقدة مثل الدوال والكائنات Objects . وبالإضافة إلى ذلك، يمكن استخدام القواميس Dictionaries في بايثون لحل مشاكل مختلفة في البرمجة، مثل تخزين البيانات النصية في قواميس لإجراء البحث عن الكلمات المتشابهة أو حتى لتحليل النصوص ومعالجتها بشكل آلي.
وبشكل عام، تعتبر القواميس Dictionaries من الأدوات الأساسية في لغة البرمجة بايثون، حيث توفر الكثير من الإمكانيات للمبرمجين وتساعدهم في إنشاء برامج أكثر فعالية وسهولة في الإدارة والصيانة.
إنشاء القواميس Dictionaries في Python
في Python يمكننا إنشاء قاموس Dictionary من خلال تضمين قائمة مفصولة بفواصل " , " لأزواج من القيمة Value ومفتاح Key بأقواس معقوفة Curly braces {...}. وتفصل النقطتان Colon " : " كل مفتاح عن القيمة المرتبطة به .
ويوضح المثال التالي طريقة انشاء Dictionary في Python :
...........
dir0 = {id: 1, 'name':'Nora', 'size': 37}
...........
ويعبر عن القاموس Dictionary الفارغ بدون أي عناصر مكتوب قوسين فقط ، على النحو التالي: {..}.لاحظ /ي المثال التالي :
...........
dir0 = {}
...........
يمكن ايضاً استخدام الدالة dir() لإنشاء Dictionary من خلال مجموعة متغيرات أو List أو Tuple لنرى المثال التالي :
...........
d1 = dict(id=1, name="Noor", size=37)
d2 = dict({"id": 1, "name": "Noor", "size": 37})
d3 = dict([("id", 1), ("name", "Noor"), ("size", 37)])
d4 = dict(zip(("id", "name", "size"), (1, "Noor", 37)))
print(d1)
print(d2)
print(d3)
print(d4)
...........
الـ Output للمثال:
{'id': 1, 'name': 'Noor', 'size': 37} {'id': 1, 'name': 'Noor', 'size': 37} {'id': 1, 'name': 'Noor', 'size': 37} {'id': 1, 'name': 'Noor', 'size': 37}
ملاحظة : الدالة zip() تستخدم لدمج مجموعتين من نوع Tuple.
أيضاً يمكن استخدام fromkeys() لإنشاء Dictionary فهي تقوم بإرجاع Dictionary بالمفاتيح المحددة وقيم محددة أو افتراضية لنرى المثال التالي :
...........
l = ['id', 'name', 'size']
# using fromkeys() for dictionary specified keys
x = dict.fromkeys(l)
print(x)
# using fromkeys() for dictionary specified keys and values
y = dict.fromkeys(l, 0)
print(y)
...........
الـ Output للمثال:
{'id': None, 'name': None, 'size': None} {'id': 0, 'name': 0, 'size': 0}
الوصول للعناصر في Dictionary
توفر بايثون عدد من الدوال للوصل الى عناصر القواميس Dictionaries حيث يتم الوصول إلى جميع القيم الموجودة في القاموس Dictionary باستخدام الدالة values() بينما يتم الوصول الى المفاتيح بواسطة الدالة keys() كما في المثال التالي :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37}
print(d1.values())
print(d1.keys())
...........
الـ Output للمثال:
dict_values([1, 'Noor', 37]) dict_keys(['id', 'name', 'size'])
كما نرى من المثال كل من الدالتين values() و keys() ترجع النتيجة على شكل قائمة List .
و كما يمكن الوصول الى جميع عناصر الـ Dictionary ( القيم Values , المفاتيح Keys ) باستخدام items() على النحو التالي :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37}
print(d1.items())
...........
الـ Output للمثال:
dict_items([('id', 1), ('name', 'Noor'), ('size', 37)])
و للوصل الى قيمة عنصر محدد من عناصر الـ Dictionary نستخدم المفتاح الخاص بالعنصر مع الأقواس المربعة [ ] للحصول على قيمة العنصر . كما يتضح في المثال التالي:
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37}
print(d1['name'])
...........
الـ Output للمثال:
Noor
يمكن ايضاً استخدام الدالة get() مع مفتاح العنصر للوصول الى قيمة هذا العنصر الـ Dictionary كما في المثال التالي:
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37}
print(d1.get('name'))
...........
الـ Output للمثال:
Noor
وللتأكد من ان احد العناصر موجود في الـ Dictionary يمكن استخدام العبارة if…in كما يتضح في المثال التالي :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37}
if 'name' in d1:
print("Yes, the name is " + d1['name'])
...........
الـ Output للمثال:
Yes, the name is Noor
خصائص القواميس Dictionaries في Python
في القاموس Dictionary المفاتيح Keys فريدة لايمكن أن تكون متكررة. وغير قابلة للتغير لهذا يمكن استخدام أنواع بيانات غير القابلة للتغيير مثل float و frozenset و int و str و tuple كمفاتيح في الـ Dictionary، لكن الأنواع القابلة للتغيير مثل dir و list و set لا يمكن استخدامها.
في القاموس Dictionary القيم Values يمكن أن تكون مكررة ومن أي نوع من أنواع البيانات مثلاً Numbers, Strings, Lists, Sets, Dictionaries, Functions وما إلى ذلك.
في Python يمكن مقارنة أنواع القواميس Dictionaries باستخدام عوامل المقارنة المعيارية للمساواة (== و =! ) و تطبيق المقارنات للعناصر عنصرًا تلو الآخر (وبشكل متكرر للعناصر المتداخلة مثل المجموعات أو القواميس داخل القواميس). اما عناصر المقارنة التكافئية (<= ،> = ،>) غير مدعومة لأنها لا معنى لها للمجموعات غير المرتبة مثل القواميس Dictionaries. لنأخذ مثال على مقارنة القواميس Dictionaries في بايثون :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37}
d2 = {'id': 1, 'name': 'Noor', 'size': 37}
print(d1 == d2)
print(d2 != d1)
...........
الـ Output للمثال:
True False
دوال العمل مع Dictionary في Python
توفر Python مجموعة من الدوال التي تعمل مع الـ Dictionary وبواسطتها يمكن التحكم بـ Dictionary وهذه الدوال هي :
- دوال إضافة عناصر الى Dictionary.
- دوال حذف عناصر الى Dictionary.
- دوال أخرى يمكنها العمل مع الـ Dictionary.
دوال إضافة عناصر الى Dictionary
يمكن اضافة عناصر الى القاموس Dictionary في بايثون باستخدام لدالة update() التى بواسطتها يمكن إضافة عنصر جديد أو تغير قيمة عنصر موجود لاحظ /ي المثال التالي :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37}
print(d1)
#Here update() function change the "id" value
d1.update({'id': 2})
print(d1)
# Now update() function add the new item to "d1"
d1.update({'Age': 26})
print(d1)
...........
الـ Output للمثال:
{'id': 1, 'name': 'Noor', 'size': 37} {'id': 2, 'name': 'Noor', 'size': 37} {'id': 2, 'name': 'Noor', 'size': 37, 'Age': 26}
تقوم الدالة setdefault() بإرجاع قيمة العنصر بالمفتاح المحدد. فإذا كان المفتاح غير موجود ، تقوم بإضافة المفتاح بالقيمة المحددة كما يتضح في المثال التالي :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37}
print(d1.setdefault('size'))
x = d1.setdefault('age', 26)
print(d1)
...........
الـ Output للمثال:
37 {'id': 1, 'name': 'Noor', 'size': 37, 'age': 26}
دوال حذف العناصر من الـ Dictionary
لحذف العناصر من الـ Dictionary في بايثون نستخدم الدوال التالية :
وهنا مثال على طريقة عمل هذه دوال حذف العناصر من الـ Dictionary :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37, 'age':26}
d1.popitem()
print(d1)
d1.pop('id')
print(d1)
del d1['size']
print(d1)
d1.clear()
print(d1)
...........
الـ Output للمثال:
{'id': 1, 'name': 'Noor', 'size': 37} {'name': 'Noor', 'size': 37} {'name': 'Noor'} {}
دوال أخرى يمكنها العمل مع الـ Dictionary
تتيح بايثون أيضاً عمل الدوال len() و copy() مع الـ Dictionary تماماً كما تعمل مع أنواع مجموعات البيانات الأخرى ( تم شرح عمل هذه الدوال في مقال البيانات التسلسلية في لغة Python) وكما يتضح في المثال التالي :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37, 'age':26}
#len() returns the dictionary length
print(len(d1))
#copy() for make dictionary copy
d2 = d1.copy()
print(d2)
...........
الـ Output للمثال:
4 {'id': 1, 'name': 'Noor', 'size': 37, 'age': 26}
الـ Dictionary وحلقة التكرار for
في بايثون يمكن أن تستخدم حلقة التكرار for مع الـ Dictionary لإرجاع البيانات من عناصر الـ Dictionary ، سواء كانت مفاتيح فقط أو قيم فقط او العنصركامل لنرى الأمثلة :
لإرجاع المفاتيح keys
استخدام الحلقة for مع الـ Dictionary لإرجاع المفاتيح Keys يكون بطريقتين كما يظهر المثال التالي :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37, 'age':26}
for i in d1:
print(i)
#OR
for i in d1.keys():
print(i))
...........
لإرجاع القيم values
يظهر المثال التالي استخدام الحلقة for مع الـ Dictionary لإرجاع القيم Values يكون بطريقتين كما يظهر المثال التالي :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37, 'age':26}
for i in d1:
print(d1[i])
#OR
for i in d1.values():
print(i)
...........
إرجاع العناصر items
كما يمكن استخدام الحلقة for مع الـ Dictionary لإرجاع المفاتيح Keys والقيم Values معاً كما يظهر المثال التالي :
...........
d1 = {'id': 1, 'name': 'Noor', 'size': 37, 'age':26}
for x ,y in d1.items():
print(x , y)
...........
الـ Output للمثال:
id 1 name Noor size 37 age 26
القواميس المتداخلة Nested Dictionaries
في Python يمكن أن يحتوي القاموس Dictionary على قواميس Dictionaries داخلية، وهو ما يسمى بالقواميس المتداخلة Nested Dictionaries وهنا أمثلة توضح طريقة بناء قواميس المتداخلة Nested dictionaries :
...........
#Build the nested dictionaries
customers = {'customer1': {'id': 1, 'name': 'Noor', 'size': 37},
'customer2': {'id': 2, 'name': 'Mona', 'size': 36},
'customer3': {'id': 3, 'name': 'Sara', 'size': 38},
}
#OR
customer1 = {'id': 1, 'name': 'Noor', 'size': 37}
customer2 = {'id': 2, 'name': 'Mona', 'size': 36}
customer3 = {'id': 3, 'name': 'Sara', 'size': 38}
customers= {'customer1': customer1,
'customer2': customer2,
'customer3':customer3
}
#To access items in nested dictionaries
print(customers['customer1']['name'])
...........
استخدام القواميس Dictionaries في Python
القواميس (Dictionaries) في Python توفر طريقة قوية لحل المشكلات البرمجية. فيما يلي بعض الطرق التي يمكنك الاستفادة منها في استخدام القواميس لحل المشكلات البرمجية:
- تخزين واسترجاع البيانات بواسطة المفاتيح: يعتبر الاستفادة الأساسية من القواميس هو تخزين البيانات باستخدام المفاتيح واسترجاعها بشكل سريع. يمكنك استخدام المفاتيح للوصول السريع إلى القيم المرتبطة بها دون الحاجة إلى البحث في القائمة أو الهيكل البياني الآخر.
- إنشاء قوائم (Key -Value): يمكنك استخدام القواميس لإنشاء قوائم مفتاح-قيمة حيث يتم تعيين قيمة لكل مفتاح. هذا يمكن أن يفيد في تنظيم البيانات وإجراء العمليات المنطقية بناءً على القيم المرتبطة بكل مفتاح.
- استخدام القواميس كمجموعة Set فريدة من العناصر: يمكننا استخدام القواميس لإنشاء مجموعة فريدة من العناصر. بمجرد استخدام المفاتيح كعناصر في القاموس وتعيين قيمة ثابتة لها، يمكننا استخدام هذا القاموس كمجموعة فريدة للعناصر دون تكرار.
- تنظيم البيانات بشكل هرمي: يمكننا استخدام القواميس لتنظيم البيانات بشكل هرمي. بواسطة استخدام القواميس كقواميس متداخلة حيث يمكن أن تكون القيم في القواميس هي قواميس أخرى. هذا يسمح لنا بتنظيم البيانات بشكل هرمي والوصول إلى البيانات بطريقة سهلة ومنظمة.
- التحكم في البيانات وتحديثها: يمكننا تحديث القيم في القواميس أو إضافة مفاتيح جديدة بقيمها المقابلة. هذا يتيح لنا التحكم في البيانات وتحديثها بسهولة.
- البحث الفعال: يمكننا استخدام القواميس لإجراء عمليات بحث فعالة. بدلاً من البحث في القوائم أو الهياكل البيانية الأخرى، يمكننا الوصول إلى القيم بواسطة المفاتيح مما يوفر أداءً سريعًا في البحث.
إن القواميس Dictionaries في Python تتيح لنا الوصول السريع إلى البيانات وتنظيمها بشكل فعال. فيمكننا استخدامها في حل مشكلات مختلفة مثل:
- تحويل بيانات غير منظمة إلى بيانات منظمة: يمكنك استخدام القواميس لتحويل بيانات غير منظمة إلى هيكل منظم ومفهرس. على سبيل المثال، إذا كان لدينا قائمة من الأشخاص ونرغب في تنظيمها بواسطة الاسم أو العمر، يمكنك استخدام قاموس لتفريع الأشخاص بواسطة المفاتيح المناسبة.
- حساب الإحصائيات والتحليل: يمكننا استخدام القواميس لحساب الإحصائيات والتحليل على البيانات. يمكنك استخدام المفاتيح كفئة لتمثيل الفئات أو المتغيرات، واستخدام القيم لتخزين البيانات المرتبطة بها. بذلك يمكننا حساب المتوسطات، العدد الأكثر تكراراً، الحد الأدنى، الحد الأقصى، وغيرها من الإحصائيات بسهولة.
- إجراء البحث والتطابق: يمكننا استخدام القواميس للبحث عن بيانات محددة أو إجراء التطابق بين بيانات. يمكننا استخدام المفاتيح كشرط للبحث والتحقق مما إذا كانت القيم المقابلة تطابق الشروط المحددة.
- تنظيم السجلات وقواعد البيانات البسيطة: يمكننا استخدام القواميس لتنظيم السجلات وقواعد البيانات البسيطة. يمكننا استخدام قاموس لتمثيل السجلات، حيث يتم استخدام المفاتيح كحقول والقيم كقيم لكل حقل.
- حل المشكلات الخوارزمية: يمكننا استخدام القواميس في حل مشكلات الخوارزميات المختلفة. القواميس توفر تنظيمًا سريعًا وفعالًا للبيانات، مما يسهل تطبيق خوارزميات البحث، الفرز، التجميع، وغيرها.
هذه بعض الطرق التي يمكن الاستفادة منها في استخدام القواميس لحل المشكلات البرمجية في Python. تذكر أن القواميس مرنة ومتعددة الاستخدامات، ويمكن استخدامها في حل مشكلات برمجية متنوعة بطرق مبدعة ومفيدة.
جميع الأمثلة لهذا المقال متوفر هنا.
إلى هنا ينتهي هذا المقال الذي تكلم عن نوع من أنواع مجموعات البيانات في لغة Python وهو مجموعات البيانات التخطيطية Mapping types التي تمثل في Python بـ القواميس Dictionaries. تعرفنا على طريقة انشاء الـ Dictionaries خصائصها والدوال التي توفرها بايثون للعمل مع Dictionaries، كما شرحنا طريقة عمل حلقة التكرار مع الـ Dictionaries وتعرفنا على مفهوم القواميس المتداخلة Nested Dictionaries .