ساختارهای داده در 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