ساختارهای داده در Python – DEV Community
وقتی ما در پایتون کد می نویسیم معمولاً ساختارهای داده ای متعددی وجود دارد مانند list، tuple، set، و dict که ما بیشتر از آن استفاده می کنیم.  اما در کنار این چهار، پایتون ساختارهای داده دیگری دارد که هر کدام مانند آن چهار دارای نقاط قوت و ضعفی بر اساس پیاده سازی و ساختارشان هستند که می توانیم از آنها استفاده کنیم و بهتر است آنها را بشناسیم زیرا گاهی ممکن است کمک کند و عملکرد بهتری داشته باشد و ویژگی های بر اساس مشکل شما از list، tuple، set، و dict.

(مشاهده اندازه واقعی!)
یادداشت:
- توالی کانتینر دنباله هایی هستند که می توانند انواع مختلفی را در خود جای دهند و می توانند تودرتو باشند.
 - دنباله های مسطح دنباله هایی هستند که فقط می توانند یک نوع ساده را در خود جای دهند.
 
من سعی می کنم نمودار بالا را از چپ به راست توضیح دهم. همچنین، من از طریق برخی از ساختارهای داده که شما قبلاً با آنها آشنا هستید، مرور نمی کنم.
فهرست در پایتون یک آرایه پویا است که میتواند شامل چندین نوع داده باشد و به راحتی میتوانید از یک لیست پایتون به عنوان پشته استفاده کنید. .append() و .pop() روش ها و عملکرد خوبی دارند.  اما، زمانی که صحبت از .insert() (یک مورد را به ابتدای لیست اضافه کنید) یا .pop() از ابتدای یک لیست، کارآمد نیست زیرا همه موارد دیگر باید با یک جابجا شوند.
بنابراین، استفاده از آن توصیه می شود collections.deque برای یک صف اول ورود، اول خروج.
from collections import deque
queue = deque([1, 2, 3]) # queue = [1, 2, 3]
queue.append(4) # queue = [1, 2, 3, 4]
queue.popleft() # queue = [2, 3, 4]
پایتون array type یک نوع توالی است که فقط می تواند انواع پایه مانند کاراکترها، اعداد صحیح و شناور را در خود جای دهد و زمانی که تعداد زیادی آیتم را در آن نگه دارید بسیار کارآمد است.array  روش های دیگری مانند .frombytes و .tofile بعلاوه .append، .pop، و .extend که در آن دارید list.
from array import array
numbers = array('l', [1, 2, 3, 4, 5]) # creating an array of 5 [type] items
مستندات پایتون: آرایه را ببینید.
set  هست یک بدون سفارش ساختار داده در پایتون که می تواند نگه دارد غیر تکراری قابل هش کردن موارد.
Hashable انواع یا کلاس هایی هستند که این را پیاده سازی می کنند __hash__ روش.
from collections import abc
# Test hashable
issubclass(int, abc.Hashable) # True
issubclass(list, abc.Hashable) # False
# define set using set() and {}
cities = set(['Berlin', 'Amsterdam', 'London', 'Amsterdam']) # {'Amsterdam', 'Berlin', 'London'}
cities = {'Berlin', 'Amsterdam', 'London', 'Amsterdam'{ # {'Amsterdam', 'Berlin', 'London'}
cities.add('London') # {'Amsterdam', 'Berlin', 'London'}
cities.add('Rome') # {'Amsterdam', 'Berlin', 'Rome', 'London'}
همچنین، یک نسخه تغییرناپذیر از مجموعه به نام وجود دارد frozenset که می توانید استفاده کنید.
cities = frozenset(['Berlin', 'Amsterdam', 'London', 'Amsterdam']) # {'Amsterdam', 'Berlin', 'London'}
مستندات Python: set and fronzenset را ببینید.
پس از انتشار پایتون 3.6 dict بر اساس درج اقلام سفارش داده می شود و نیازی ندارید collections.OrderedDict مگر اینکه بخواهید کد شما با پایتون < 3.6 سازگار باشد!
Counter  یک زیر کلاس از dict برای hashable آیتم هایی در پایتون که می توانید از آنها برای شمارش آیتم های استفاده شده از آن استفاده کنید.
from collections import Counter
repeat_count = Counter(['Berlin', 'Amsterdam', 'London', 'Amsterdam'])
# Counter({'Amsterdam': 2, 'Berlin': 1, 'London': 1})
مستندات پایتون: شمارنده را ببینید.
با استفاده از ChainMap میتوانید چندین نقشه را با هم گروهبندی کنید و یک نمای قابل بهروزرسانی از آنها ایجاد کنید.
from collections import ChainMap
base = {'python': '3.10', 'year': '2021'}
new_update = {'python': '3.11', 'year': '2022', 'author': 'Guido van Rossum'}
python = ChainMap(base, new_update)
# ChainMap({'python': '3.10', 'year': '2021'}, {'python': '3.11', 'year': '2022', 'author': 'Guido van Rossum'})
list(python) # ['python', 'year', 'author']
می توانید به استفاده از آن فکر کنید ** برای پیوستن به چند dict با هم به جای استفاده ChainMap اما در نظر داشته باشید که ChainMap نگاشت های اساسی را با مرجع ترکیب می کند، بنابراین اگر خود را به روز کنید dict، شما ChainMap نمایش نیز در حال به روز رسانی است.
a = {**base, **new_update} # {'python': '3.11', 'year': '2022', 'author': 'Guido van Rossum'}
new_update['python'] = '3.12'
a # {'python': '3.11', 'year': '2022', 'author': 'Guido van Rossum'}
python # ChainMap({'python': '3.10', 'year': '2021'}, {'python': '3.12', 'year': '2022', 'author': 'Guido van Rossum'})
به مستندات پایتون مراجعه کنید: ChainMap.
در queue کتابخانه پایتون، میتوانید چندین پیادهسازی صف را بیابید که من در اینجا توضیح مختصری درباره آنها میدهم.
  صف
اجرای یک صف FIFO (اول وارد، اول خروج) در پایتون.
صف طول می کشد maxsize آرگومان که اندازه صف است و اگر تعداد آیتم های صف به این عدد برسد صف شما مسدود می شود تا زمانی که آیتم ها را از آن مصرف کنید.
from queue import Queue
q = Queue(1)
q.put('first')
q.put_nowait('second') # does not wait until get an item and raise an error if queue is full, which in this case queue is full and raise error
q.get() # 'first'
  LifoQueue
LifoQueue  یک زیر کلاس از Queue که یک صف LIFO (آخرین ورود، اولین خروج) را پیاده سازی می کند.
  صف اولویت
PriorityQueue یک زیر کلاس از Queue است که آیتم های موجود در صف را بر اساس اولویت کوچکترین به بزرگترین برمی گرداند.
from queue import PriorityQueue
q = PriorityQueue(3)
q.put(30)
q.put(14)
q.put(21)
q.get() # 14
q.get() # 21
q.get() # 30
  SimpleQueue
SimpleQueue  یک پیاده سازی از صف FIFO (first-in, first-out) است که نامحدود است و در Python 3.7 اضافه شده است.
توجه داشته باشید که پایتون استفاده می کند collections.deque زیر کاپوت در SimpleQueue.
به مستندات پایتون: صف مراجعه کنید.
پست های بیشتر در وبلاگ من – peyman.blog



