• Home
  • /
  • Blog
  • /
  • 9 حاويات مفيدة في وحدة تجميع Python يجب أن تعرفها

9 حاويات مفيدة في وحدة تجميع Python يجب أن تعرفها

حاويات في بايثون

This post is also available in: English (الإنجليزية) हिन्दी (الهندية)

ما هي الحاويات في بايثون؟

الحاوية عبارة عن كائن يتم استخدامه لتخزين كائنات مختلفة وتوفير طريقة للوصول إلى الكائنات المضمنة والتكرار عليها.

توفر Python عددًا من أنواع بيانات الحاويات، سواء الأنواع المضمنة أو تلك الموجودة في وحدة المجموعات فيمكتبة Python القياسية.

تخدم حاويات البيانات المختلفة أغراضًا مختلفة ، وتوفر وظائف مختلفة ، وتقدم أداءً حسابيًا مختلفًا تمامًا لأنواع مماثلة من الحسابات. وبالتالي ، يعد اختيار الحاوية المناسبة للمهمة المطروحة خطوة مهمة في تحقيق الأداء الجيد. المجموعات في Python هي الحاويات التي تُستخدم لتخزين مجموعات البيانات ، على سبيل المثال ، list ، و dict، و set ، و tuple ، إلخ. هذه مجموعات مدمجة. بصرف النظر عن هذه الوحدات العديدة الأخرى التي تم تطويرها والتي توفر هياكل بيانات إضافية لتخزين مجموعات البيانات. إحدى هذه الوحدات هي وحدة Python Collection.

الحاويات في وحدة تجميع بايثون

توفر وحدة تجميع Python التسعة حاويات المختلفة التالية.

1. Counter

العداد عبارة عن حاوية تتعقب عدد مرات إضافة القيم المكافئة. تعد فئة عداد Python جزءًا من وحدة المجموعات وهي فئة فرعية من القاموس.

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

حاويات في بايثون
عداد

يمكن أن تكون عناصر العداد أعدادًا صحيحة موجبة أو صفرية أو سالبة. على الرغم من عدم وجود قيود في مفاتيحها وقيمها ، بشكل عام ، يُقصد من القيم أن تكون أرقامًا ولكن يمكن تخزين أنواع الكائنات الأخرى أيضًا.

يدعم العداد ثلاثة أشكال من التهيئة:

  • يمكن استدعاء مُنشئها بسلسلة من العناصر
  • قاموس يحتوي على مفاتيح وحسابات
  • استخدام وسيطات الكلمات الأساسية لتعيين أسماء السلاسل لتعدادها

يوضح الكود التالي استخدامه.

import collections
print (collections.Counter(['a', 'b', 'c', 'a', 'b', 'b']))
print (collections.Counter({'a': 2, 'b': 3, 'c':1}))
print(collections.Counter(a=2, b=3, c=1))

الإخراج من جميع أشكال التهيئة الثلاثة هو نفسه:

Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})

2. أمرت ديكت

OrderedDict هي فئة فرعية من كائن deb في بايثون. الفرق الوحيد بين OrderedDict و Dict هو أنه في OrderedDict ، يحافظ على أوامر المفاتيح كما تم إدخالها. في الإملاء ، قد يحدث الطلب أو لا يحدث.

في هذا المثال يمكننا أن نرى أن ترتيب Dict قد يختلف. لكن بالنسبة لل OrderedDict. سيتم إصلاحه.

import collections
#Create normal dict
my_dict = {}
my_dict['AA'] = 11
my_dict['CC'] = 33
my_dict['BB'] = 22
my_dict['DD'] = 44
for item in my_dict.items():
   print(item)
print()
#Create ordered dict
my_ord_dict = collections.OrderedDict()
my_dict['AA'] = 11
my_dict['CC'] = 33
my_dict['BB'] = 22
my_dict['DD'] = 44
for item in my_ord_dict.items():
   print(item)

ناتج الكود أعلاه هو:

('AA', 11)
('CC', 33)
('BB', 22)
('DD', 44)

('AA', 11)
('BB', 22)
('CC', 33)
('DD', 44)

3. التقصير

يعمل المصطلح الافتراضي تمامًا مثل الإملاء العادي ، ولكن تتم تهيئته بوظيفة (“المصنع الافتراضي”) لا تأخذ أي وسيطات وتوفر القيمة الافتراضية لمفتاح غير موجود.

لن يقوم البيان الافتراضي بإصدار خطأ KeyError مطلقًا. يحصل أي مفتاح غير موجود على القيمة التي يتم إرجاعها بواسطة المصنع الافتراضي.

يشرح الكود التالي عمل الضبط الافتراضي:

from collections import defaultdict
ice_cream = defaultdict(lambda: 'Vanilla')
ice_cream['Sarah'] = 'Strawberry'
ice_cream['Abdul'] = 'Butter Pecan'
print ice_cream['Sarah']
print ice_cream['Joe']

ناتج الكود أعلاه هو:

Strawberry
Vanilla

4. ChainMap

تقوم ChainMap بتغليف العديد من القواميس في وحدة واحدة. تُستخدم الخرائط لعرض أزواج القيمة الرئيسية لجميع القواميس من ChainMap. تقوم طريقة keys () بإرجاع المفاتيح من ChainMap ، وتقوم طريقة القيم () بإرجاع قيم المفاتيح المختلفة من ChainMap.

حاويات في بايثون

يوضح المثال التالي استخدام ChainMap:

from collections import ChainMap 
d1 = {'a': 1, 'b': 2}
d2 = {'c': 3, 'd': 4}
d3 = {'e': 5, 'f': 6}
# Defining the chainmap 
c = ChainMap(d1, d2, d3) 
# Accessing Values using key name
print(c['a'])
# Accessing values using values()
print(c.values())  
# Accessing keys using keys()
print(c.keys())

ناتج الكود أعلاه هو:

1
ValuesView(ChainMap({‘a’: 1, ‘b’: 2}, {‘c’: 3, ‘d’: 4}, {‘e’: 5, ‘f’: 6}))
KeysView(ChainMap({‘a’: 1, ‘b’: 2}, {‘c’: 3, ‘d’: 4}, {‘e’: 5, ‘f’: 6}))

6. مسمى مضاعف

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

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

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

يوضح الكود التالي ميزة استخدام namedtuple:

from collections import namedtuple
# Declaring namedtuple() 
Student = namedtuple('Student',['name','age','DOB']) 
# Adding values 
S = Student('Rakesh','18','2542003') 
# Access using index 
print ("The Student age using index is : ",end ="") 
print (S[1]) 
# Access using name  
print ("The Student name using keyname is : ",end ="") 
print (S.name)

ناتج الكود أعلاه هو:

The Student age using index is : 18
The Student name using keyname is : Rakesh

7. Deque

تتميز قائمة الانتظار المزدوجة ، أو Deque ، بميزة إضافة العناصر وإزالتها من أي من الطرفين. لديها طرق لإضافة وإزالة العناصر التي يمكن استدعاؤها مباشرة مع الوسائط.

يوضح الكود التالي استخدام Deque:

import collections
# Create a deque
DoubleEnded = collections.deque(["Mon","Tue","Wed"])
print (DoubleEnded)
# Append to the right
print("Adding to the right: ")
DoubleEnded.append("Thu")
print (DoubleEnded)
# append to the left
print("Adding to the left: ")
DoubleEnded.appendleft("Sun")
print (DoubleEnded)
# Remove from the right
print("Removing from the right: ")
DoubleEnded.pop()
print (DoubleEnded)
# Remove from the left
print("Removing from the left: ")
DoubleEnded.popleft()
print (DoubleEnded)
# Reverse the dequeue
print("Reversing the deque: ")
DoubleEnded.reverse()
print (DoubleEnded)

ناتج الكود أعلاه هو:

deque(['Mon', 'Tue', 'Wed'])
Adding to the right: 
deque(['Mon', 'Tue', 'Wed', 'Thu'])
Adding to the left: 
deque(['Sun', 'Mon', 'Tue', 'Wed', 'Thu'])
Removing from the right: 
deque(['Sun', 'Mon', 'Tue', 'Wed'])
Removing from the left: 
deque(['Mon', 'Tue', 'Wed'])
Reversing the deque: 
deque(['Wed', 'Tue', 'Mon'])

8. UserDict

تزودنا Python بهيكل بيانات القاموس للتعامل مع القيمة الأساسية من البيانات. يضيف UserDict التخصيص إليه.

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

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

تقبل مجموعة UserDict القاموس الموجود كوسيطة وتقوم بتشغيل بنية القاموس المخزنة في كائن dt المعتاد.

يوضح الكود التالي استخدام UserDict:

from collections import UserDict
class mydata(UserDict):
	def pop(self, s = None):
		raise RuntimeError("Deletion not allowed")
mydict = mydata({'x':10,
    'y': 20})
print(mydict)
#Deleting From Dict
mydict.pop()

ناتج الكود أعلاه هو:

{'x': 10, 'y': 20}
Traceback (most recent call last):
  File "/home/demo.py", line 15, in <module>
    mydict.pop()
  File "/home/demo.py", line 7, in pop  	
    raise RuntimeError("Deletion not allowed")
RuntimeError: Deletion not allowed

9. UserList

مثل UserDict ، تقدم لك UserList أيضًا طريقة لتخصيص القوائم في Python ليتم غرسها في الفصول الدراسية. تقوم قوائم Python بتخزين أنواع متشابهة من البيانات بأنواع بيانات مختلفة تمامًا. تساعدك UserList على تخصيص القائمة واستخدامها كسمة لإنشاء فئات محددة بواسطة المستخدم منها. بعد إضافة القائمة كمثيل ، يتم تشغيل قائمة يتم الاحتفاظ بها في بنية بيانات القائمة المعتادة.

يوضح الكود التالي استخدام UserList:

from collections import UserList 
# Creating a List where 
# deletion is not allowed 
class MyList(UserList): 
    # Function to stop deletion 
    # from List 
    def remove(self, s = None): 
        raise RuntimeError("Deletion not allowed") 
    # Function to stop pop from  
    # List 
    def pop(self, s = None): 
        raise RuntimeError("Deletion not allowed") 
# Driver's code 
L = MyList([1, 2, 3, 4]) 
print("Original List") 
# Inserting to List" 
L.append(5) 
print("After Insertion") 
print(L) 
# Deleting From List 
L.remove()

ناتج الكود أعلاه هو:

Original List
After Insertion
[1, 2, 3, 4, 5]
Traceback (most recent call last):
  File "/home/UL.py", line 33, in <module>
    L.remove() 
  File "/home/UL.py", line 15, in remove
    raise RuntimeError("Deletion not allowed") 
RuntimeError: Deletion not allowed
{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}
>