آموزش

آموزش ساختار داده‌ها در پایتون

با ساختار داده‌ها در پایتون آشنا می‌شیم و درباره انواع داده‌ها و ساختمان‌داده‌های اولیه (Primitive) و غیراولیه (Non-Primitive)، مانند رشته‌ها، لیست‌ها، پشته‌ها و سایر موارد یاد می‌گیریم.

تاریخ انتشار:
10 شهریور 1405
پایتون
15 دقیقه
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

ساختارهای داده روشی برای سازماندهی و ذخیره داده‌ها هستن تا بشه خیلی راحت و کارآمد بهشون دسترسی داشت و ازشون استفاده کرد. این ساختارها رابطه بین داده‌ها و کارهایی که می‌شه روشون انجام داد رو مشخص می‌کنن. انواع مختلفی از ساختارهای داده وجود داره که به دانشمندان داده و مهندسان کامپیوتر کمک می‌کنه تا به جای درگیر شدن با جزئیات ذخیره و دسترسی به داده‌ها، روی تصویر بزرگ‌تر یعنی حل مسائل اصلی تمرکز کنن.

تو این آموزش، با ساختارهای داده مختلف تو پایتون آشنا می‌شی و می‌بینی که چطور پیاده‌سازی می‌شن:

  • نوع داده انتزاعی و ساختارهای داده
  • ساختارهای داده اولیه
    • اعداد صحیح
    • اعشاری
    • رشته‌ها
    • بولین
  • ساختارهای داده غیر اولیه
    • آرایه‌ها
    • لیست‌ها
    • تاپل‌ها
    • دیکشنری
    • مجموعه‌ها
    • فایل‌ها

تو دوره رایگان مقدمه‌ای بر پایتون برای علم داده فینکا، می‌تونی بیشتر در مورد استفاده از پایتون مخصوصاً تو زمینه علم داده یاد بگیری. این دوره مفاهیم پایه پایتون رو بهت معرفی می‌کنه و توش می‌تونی با متدها، توابع و پکیج numpy آشنا بشی.

نوع داده انتزاعی و ساختارهای داده

همون‌طور که تو مقدمه خوندی، ساختارهای داده بهت کمک می‌کنن تا به جای درگیر شدن با جزئیات، روی تصویر کلی مسئله تمرکز کنی. به این کار اصطلاحاً انتزاع داده (Data Abstraction) می‌گن.

در واقع، ساختارهای داده همون پیاده‌سازی انواع داده انتزاعی هستن. این پیاده‌سازی با استفاده از یه سری ساختارهای برنامه‌نویسی و انواع داده‌های پایه، یه دید فیزیکی از داده‌ها بهمون می‌ده.

به طور کلی، تو علوم کامپیوتر می‌شه ساختارهای داده رو به دو دسته تقسیم کرد: اولیه و غیر اولیه. دسته اول ساده‌ترین شکل نمایش داده‌ها هستن، ولی دسته دوم پیشرفته‌ترن؛ یعنی ساختارهای داده اولیه رو برای اهداف خاص تو یه سری ساختار پیچیده‌تر ترکیب می‌کنن.

ساختارهای داده اولیه

اینا پایه‌ای‌ترین و ابتدایی‌ترین ساختارهای داده هستن. ابزارهای خیلی به درد بخوری برای کار با داده‌ها محسوب می‌شن و فقط شامل مقادیر خالص و ساده‌ان. پایتون چهار نوع متغیر اولیه داره:

  • اعداد صحیح
  • اعشاری
  • رشته‌ها
  • بولین

تو بخش‌های بعدی، بیشتر باهاشون آشنا می‌شی!

اعداد صحیح

می‌تونی از اعداد صحیح (Integer) برای نشون دادن داده‌های عددی و به طور خاص، اعداد کامل از منفی بی‌نهایت تا مثبت بی‌نهایت استفاده کنی؛ مثل ۴، ۵ یا 1-.

اعشاری

کلمه Float مخفف floating point یا همون عدد اعشاریه. می‌تونی از این نوع داده برای اعداد کسری استفاده کنی که معمولاً بخش اعشاری دارن؛ مثل ۱.۱۱ یا ۳.۱۴.

یه نگاه به قطعه کد زیر بنداز و خودت چند تا از عملیات‌های اعداد صحیح و اعشاری رو امتحان کن!

یادت باشه که تو پایتون لازم نیست نوع متغیر یا داده رو صریحاً مشخص کنی. دلیلش اینه که پایتون یه زبان با تایپ پویا (Dynamically Typed) هست. تو اینجور زبان‌ها، نوع داده‌ای که یه شیء می‌تونه تو خودش نگه داره، قابل تغییره.

رشته

رشته‌ها (Strings) مجموعه‌ای از حروف الفبا، کلمات یا کاراکترهای دیگه هستن. تو پایتون می‌تونی با گذاشتن یه سری کاراکتر داخل کوتیشن تکی (' ') یا جفت کوتیشن (" ") یه رشته بسازی؛ مثل 'cake' یا "cookie".

همینطور می‌تونی از عملگر + استفاده کنی تا دو یا چند تا رشته رو به هم بچسبونی، دقیقاً مثل مثال زیر:

خروجی
Cake & Cookie

اینجا چند تا کار ساده دیگه هم هست که می‌تونی با رشته‌ها انجام بدی؛ مثلاً می‌تونی از * برای تکرار یه رشته به تعداد مشخصی استفاده کنی:

خروجی
CakeCake

همچنین می‌تونی رشته‌ها رو برش (slice) بدی؛ یعنی بخش‌هایی از یه رشته رو جدا کنی:

خروجی
ke
Co

یادت باشه که رشته‌ها می‌تونن شامل کاراکترهای عددی هم باشن، اما عملگر + همچنان همون کار چسبوندن رشته‌ها رو انجام می‌ده.

خروجی
42

پایتون متدهای داخلی یا توابع کمکی زیادی برای تغییر رشته‌ها داره. از جایگزین کردن یه زیررشته گرفته تا بزرگ کردن حروف بعضی کلمات تو یه متن یا پیدا کردن جای یه رشته داخل یه رشته دیگه. بیا چند تا از این کارها رو تو عمل ببینیم:

بزرگ کردن حروف اول رشته‌ها

خروجی
Cookie

محاسبه طول یه رشته بر اساس تعداد کاراکترها. حواست باشه که فاصله‌ها (Space) هم جزو کاراکترها حساب می‌شن:

خروجی
8

بررسی اینکه آیا یک رشته فقط از اعداد تشکیل شده یا نه

خروجی
False
خروجی
True

جایگزین کردن بخش‌هایی از رشته با رشته‌های دیگه

خروجی
Cake 404

برای پیدا کردن یه زیررشته داخل رشته دیگه، می‌تونی از متدهایی استفاده کنی که پایین‌ترین اندیس (اولین جایگاهی) که اون زیررشته پیدا می‌شه رو برمی‌گردونن:

خروجی
0

زیررشته 'cook' دقیقاً اول 'cookie' پیدا می‌شه. بنابراین، خروجی جایگاهی رو نشون می‌ده که اون کلمه شروع شده. تو این حالت، 0 برگردونده می‌شه چون تو برنامه‌نویسی شمارش اندیس‌ها از 0 شروع می‌شه!

خروجی
12

مشابه مثال قبل، زیررشته 'cook' تو جایگاه ۱۲ تو جمله 'I got you a cookie' پیدا می‌شه. یادت نره که شمارش از 0 شروع می‌شه و فاصله‌ها هم شمرده می‌شن!

می‌تونی لیست کامل متدهای رشته‌ای تو پایتون رو اینجا پیدا کنی.

بولین (Boolean)

این نوع داده داخلی فقط می‌تونه دو تا مقدار True (درست) و False (غلط) رو بگیره، که معمولاً با اعداد ۱ و 0 هم معادل هستن. بولین‌ها تو شرط‌ها و مقایسه‌ها خیلی کاربرد دارن؛ درست مثل مثال‌های زیر:

خروجی
False
خروجی
True
خروجی
No Cookie

تبدیل نوع داده

گاهی اوقات، موقع کار با کد بقیه ممکنه لازم بشه که مثلاً یه عدد صحیح رو به اعشاری تبدیل کنی یا برعکس. یا شاید متوجه بشی که اشتباهاً داشتی از یه عدد صحیح استفاده می‌کردی در حالی که به یه عدد اعشاری نیاز داشتی. تو اینجور مواقع، می‌تونی به راحتی نوع داده متغیرها رو تغییر بدی!

برای فهمیدن نوع یه شیء تو پایتون، می‌تونی از تابع داخلی type() استفاده کنی، درست مثل کدهای زیر:

خروجی
<class 'float'>

وقتی نوع یه مقدار رو از یه مدل به مدل دیگه تغییر می‌دی، به این کار می‌گن تبدیل نوع (Type Conversion). به طور کلی تبدیل داده دو حالت داره: ضمنی (Implicit) و صریح (Explicit) که به دومی معمولاً casting هم می‌گن.

تبدیل ضمنی نوع داده

این مدل تبدیل داده کاملاً خودکاره و خود کامپایلر زحمتش رو برات می‌کشه. نگاهی به مثال‌های زیر بنداز:

خروجی
<class 'float'>

تو مثال بالا نیازی نبود خودت نوع داده y رو برای تقسیم با یه مقدار اعشاری عوض کنی. کامپایلر این کار رو به صورت ضمنی و خودکار برات انجام داد.

به همین راحتی!

تبدیل صریح نوع داده

این نوع تبدیل دست خودته؛ یعنی باید خودت مستقیماً به کامپایلر بگی که نوع داده فلان مقدار رو عوض کنه. برای اینکه دقیق‌تر متوجه بشی، قطعه کد زیر رو ببین:

خروجی
Traceback (most recent call last):
  File "C:\Users\Finca\Desktop\test.py", line 3, in <module>
    fav_movie = y + x
TypeError: Can't convert 'int' object to str implicitly

مثال بالا بهت خطا داد چون پایتون نمی‌تونه بفهمه منظور تو از عملگر + جمع کردن دو تا مقداره یا به‌هم‌چسبوندن دو تا رشته. دلیلش هم اینه که داری دو نوع داده مختلف (یه عدد صحیح و یه رشته) رو با هم ترکیب می‌کنی.

اینجا یه ناهماهنگی مشخص وجود داره.

برای حل این مشکل باید اول int رو به string تبدیل کنی تا بتونی عملیات چسبوندن رو انجام بدی.

یادت باشه که شاید همیشه نشه یه نوع داده رو به نوع دیگه‌ای تبدیل کرد. چند تا از توابع داخلی برای تبدیل نوع داده که می‌تونی ازشون استفاده کنی اینا هستن: int()، float() و str().

خروجی
The Godfather: Part 2

ساختارهای داده غیر اولیه

ساختارهای داده غیر اولیه، اعضای پیچیده‌تر این خانواده هستن. این ساختارها فقط یه مقدار تنها رو نگه نمی‌دارن، بلکه مجموعه‌ای از مقادیر رو تو فرمت‌های مختلف ذخیره می‌کنن.

تو دنیای علوم کامپیوتر، این ساختارها به دسته‌های زیر تقسیم می‌شن:

  • آرایه‌ها
  • لیست‌ها
  • فایل‌ها

آرایه

آرایه‌ها (Arrays) تو پایتون یه روش فشرده برای جمع‌آوری انواع داده پایه هستن، با این شرط که تمام عناصر داخل یه آرایه باید از یه نوع باشن. با این حال، استفاده از آرایه تو پایتون به اندازه زبان‌هایی مثل ++C یا جاوا رایج نیست.

معمولاً وقتی کسی تو پایتون از کلمه آرایه استفاده می‌کنه، منظورش همون لیست‌هاست. اما بینشون یه تفاوت مهمه که یه کم جلوتر متوجهش می‌شی. آرایه‌ها تو پایتون در واقع نوع خاص و کارآمدتری از یه لیست هستن که همه عناصرشون فقط از یه نوع داده تشکیل شده.

تو پایتون برای کار با آرایه‌ها باید از ماژول array استفاده کنی و قبل از شروع کارت اون رو وارد (Import) کنی. موقع ساخت آرایه باید مشخص کنی که قراره چه نوع داده‌ای توش ذخیره بشه؛ این کار با یه کاراکتر خاص (Type Code) مثل I انجام می‌شه که تو مثال زیر هم می‌تونی ببینیش:

خروجی
<class 'array.array'>

اگه می‌خوای بیشتر درباره کدهای نوع داده و امکانات ماژول array بدونی، می‌تونی به صفحه مستندات آرایه پایتون سر بزنی.

لیست

لیست‌ها (Lists) تو پایتون برای ذخیره مجموعه‌ای از آیتم‌های مختلف استفاده می‌شن. یکی از ویژگی‌های مهم لیست‌ها اینه که تغییرپذیرن (Mutable)؛ یعنی می‌تونی محتواشون رو بدون اینکه هویت اصلی لیست به هم بخوره عوض کنی. لیست‌ها با براکت‌های [ ] شناخته می‌شن و عناصر داخلشون با کاما (,)از هم جدا می‌شن. لیست‌ها جزو ساختارهای داخلی پایتونن و برای استفاده ازشون نیازی به وارد کردن هیچ ماژولی نداری.

خروجی
<class 'list'>
خروجی
<class 'list'>
خروجی
<class 'list'>
خروجی
apple
خروجی
[1, 'orange', 3]

توجه: همون‌طور که تو مثال x1 دیدی، لیست‌ها می‌تونن آیتم‌های مشابه و هم‌نوع رو هم تو خودشون نگه دارن و عملاً کار یه آرایه رو بکنن. این کار مشکلی نداره مگر اینکه بخوای عملیات‌های خاص و ریاضی روی این مجموعه انجام بدی.

پایتون متدهای خیلی زیادی برای کار با لیست‌ها داره؛ از اضافه و حذف کردن آیتم‌ها گرفته تا مرتب یا برعکس کردن لیست. بیا چند تا از این کارها رو با هم ببینیم:

  • اضافه کردن عدد 11 به لیست list_num با متد append(). به طور پیش‌فرض، این عدد به آخر لیست اضافه می‌شه.
خروجی
[1, 2, 45, 6, 7, 2, 90, 23, 435, 11]
  • استفاده از insert() برای قرار دادن عدد 11 تو اندیس 0 از لیست list_num
خروجی
[11, 1, 2, 45, 6, 7, 2, 90, 23, 435, 11]
  • حذف کردن اولین حرف 'o' از لیست list_char با استفاده از متد remove()
خروجی
['c', 'o', 'k', 'i', 'e']
  • حذف کردن آیتمی که تو اندیس یکی مونده به آخر (اندیس 2-) لیست list_char قرار داره
خروجی
['c', 'o', 'k', 'e']
خروجی
[1, 2, 2, 6, 7, 11, 11, 23, 45, 90, 435]
خروجی
[435, 90, 45, 23, 11, 11, 7, 6, 2, 2, 1]

اگه دوست داری اطلاعات بیشتری درباره لیست‌ها تو پایتون داشته باشی، می‌تونی آموزش ۱۸ سوال رایج لیست پایتون رو هم بخونی!

آرایه در مقایسه با لیست

حالا که با لیست‌ها تو پایتون آشنا شدی، شاید برات سوال پیش بیاد که اصلاً چرا به آرایه‌ها نیاز داریم؟ دلیلش اینه که عملیات‌هایی که روی این دو تا می‌شه انجام داد خیلی با هم فرق داره. تو آرایه‌ها می‌تونی یه عملیات خاص رو به راحتی روی تک‌تک آیتم‌ها اعمال کنی، در حالی که تو لیست‌ها این کار معمولاً به این سادگی نیست. به مثال زیر توجه کن:

خروجی
array('u', 'cats')

تو تونستی از تابع tounicode() روی array_char استفاده کنی چون پایتون می‌دونه که تمام عناصر یه آرایه از یه نوع هستن، پس عملیات روی همه‌شون به یه شکل جواب می‌ده. به خاطر همین، وقتی با یه عالمه داده هم‌نوع سروکار داریم، آرایه‌ها خیلی به درد می‌خورن. از اونجایی که پایتون مجبور نیست نوع داده هر آیتم رو جداگانه تو حافظه نگه داره، برای یه سری کارها استفاده از آرایه هم سریع‌تره و هم حافظه کمتری نسبت به لیست می‌گیره.

وقتی حرف از آرایه می‌شه، حیفه به آرایه‌های numpy اشاره نکنیم. آرایه‌های numpy تو دنیای علم داده به شدت برای کار با داده‌های چندبعدی استفاده می‌شن. این آرایه‌ها از ماژول استاندارد array و همینطور لیست‌های پایتون خیلی قوی‌تر و کارآمدترن. خوندن و نوشتن داده تو آرایه‌های numpy خیلی سریعه و از عملیات بُرداری (مثل جمع کردن عنصر به عنصر دو آرایه) پشتیبانی می‌کنه. ضمناً برای پردازش دیتاست‌های بزرگ هم عالیه. برای اطلاعات بیشتر، آموزش آرایه numpy در پایتون فینکا رو بخون.

اینجا یه کد ساده داریم تا کارت رو با آرایه numpy شروع کنی:

خروجی
[ 1.  2.  3.]
خروجی
[ 1.  1.  1.  1.]
خروجی
[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]]

ساختارهای داده به طور کلی به دو دسته خطی (Linear) و غیرخطی (Non-linear) تقسیم می‌شن. مثلاً پشته‌ها (Stacks) و صف‌ها (Queues) جزو ساختارهای خطی هستن، ولی گراف‌ها و درخت‌ها ساختارهای غیرخطی محسوب می‌شن. مفاهیم این ساختارها ممکنه یه کم پیچیده باشه، ولی چون خیلی شبیه به مدل‌های واقعی تو دنیای ما هستن، کاربرد به‌شدت زیادی دارن. تو این آموزش خیلی کوتاه باهاشون آشنا می‌شی.

نکته: تو یه ساختار خطی، داده‌ها پشت سر هم و به صورت متوالی قرار دارن. یعنی می‌تونی همه داده‌ها رو تو یه دور پیمایش (پشت سر هم) ببینی. اما تو ساختارهای غیرخطی این‌طوری نیست؛ هر عنصر می‌تونه به چند تا عنصر دیگه وصل باشه تا یه رابطه خاص رو نشون بده. بنابراین شاید نشه همه داده‌ها رو با یه دور پیمایش ساده پیدا کرد.

پشته‌ها

پشته یا Stack داده‌ها رو بر اساس منطق LIFO (Last-In-First-Out) یعنی "آخرین ورودی، اولین خروجی" ذخیره می‌کنه. فرض کن تو یه مهمونی یه دسته بشقاب روی هم چیده شده؛ همیشه بشقاب جدید رو می‌ذاری روی بقیه و وقتی هم بخوای بشقاب برداری، اونی که بالاتر از همه‌ست رو برمی‌داری. تو علوم کامپیوتر از این مفهوم برای خیلی چیزا مثل تجزیه و تحلیل دستورات یا الگوریتم‌های زمان‌بندی استفاده می‌شه.

تو پایتون می‌شه پشته‌ها رو خیلی راحت با کمک همون لیست‌ها پیاده‌سازی کرد. اضافه کردن یه عنصر به پشته رو اصطلاحاً عملیات Push و برداشتنش رو Pop می‌گن. جالبه بدونی که لیست‌ها تو پایتون یه متد آماده به اسم pop() دارن که کار رو خیلی راحت می‌کنه:

خروجی
[1, 2, 3, 4, 5, 6]
خروجی
[1, 2, 3, 4]

صف‌ها

صف (Queue) داده‌ها رو بر اساس منطق FIFO (First-In-First-Out) یعنی "اولین ورودی، اولین خروجی" ذخیره و مدیریت می‌کنه. بهترین مثال برای صف، همون صف نونوایی یا باجه بلیط‌فروشیه؛ هر کسی زودتر برسه، زودتر هم کارش راه می‌افته و می‌ره. صف‌ها می‌تونن انواع مختلفی داشته باشن.

استفاده از لیست برای ساختن صف اصلاً کارآمد نیست. چون اضافه و کم کردن داده از انتهای لیست سریع انجام می‌شه، اما حذف کردن از ابتدای لیست خیلی کند پیش می‌ره (چون پایتون مجبوره جای تمام عناصر بعدی رو یه خونه شیفت بده).

گراف‌ها

تو ریاضیات و علوم کامپیوتر، گراف یه شبکه از گره‌ها (Nodes یا Vertices) هست که ممکنه به هم متصل باشن یا نباشن. خطی که دو تا گره رو به هم وصل می‌کنه رو اصطلاحاً یال (Edge) می‌گن. اگه این خط جهت‌دار باشه، بهش گراف جهت‌دار می‌گن و اگه جهت نداشته باشه، می‌شه گراف بدون جهت.

شاید این تعریف به نظرت خیلی تئوری و پیچیده بیاد. با این حال، گراف‌ها یه مفهوم خیلی مهم هستن؛ مخصوصاً تو علم داده که برای مدل‌سازی مسائل دنیای واقعی به کار می‌رن. شبکه‌های اجتماعی، نقشه‌های مسیریابی، سیستم‌های پیشنهاددهنده و حتی تحلیل‌های مولکولی تو شیمی همگی بر پایه گراف کار می‌کنن.

اینجا یه پیاده‌سازی خیلی ساده از گراف رو با کمک دیکشنری پایتون برات گذاشتیم تا بتونی کارت رو شروع کنی:

می‌تونی با گراف‌ها کارهای خیلی باحالی بکنی؛ مثلاً پیدا کنی که آیا اصلاً مسیری بین دو تا گره وجود داره؟ یا کوتاه‌ترین مسیر بینشون کدومه؟ یا حتی چرخه‌های داخل گراف رو پیدا کنی.

مسئله معروف "فروشنده دوره‌گرد" دقیقاً درباره همینه؛ یعنی پیدا کردن کوتاه‌ترین مسیری که فقط یک بار از هر گره بگذره و آخرش برگرده به نقطه اول. گاهی اوقات به یال‌های یه گراف وزن (یا هزینه) می‌دن؛ این وزن رو می‌تونی به عنوان میزان سختی یا هزینه رفتن از یه گره به گره دیگه در نظر بگیری و هدف اینه که ارزون‌ترین یا ساده‌ترین مسیر رو پیدا کنی.

درخت‌ها

درخت تو دنیای واقعی ریشه تو خاک داره و شاخه‌هاش رو به بالاست. اما تو علوم کامپیوتر، درخت‌ها برعکس کشیده می‌شن؛ یعنی ریشه در بالاترین نقطه قرار داره و شاخه‌ها و برگ‌ها میان به سمت پایین. از درخت‌ها برای نشون دادن داده‌های سلسله‌مراتبی استفاده می‌شه.

گره بالایی همون ریشه‌ست. بقیه گره‌ها می‌شن شاخه و آخرین گره تو هر مسیر رو بهش می‌گن برگ (Leaf). تو می‌تونی هر شاخه رو خودش یه درخت کوچیک‌تر در نظر بگیری. به گره بالایی می‌گن والد (Parent) و گره‌های زیرمجموعه‌اش می‌شن فرزندان (Children). گره‌هایی که والدشون یکی باشه رو اصطلاحاً خواهر و برادر (Siblings) صدا می‌زنن. واسه همینه که بهش شجره‌نامه هم می‌گن!

درخت‌ها تو همه‌چیز کاربرد دارن؛ از هوش مصنوعی بازی‌ها گرفته تا پردازش فایل‌های XML و حتی ساختار فایل‌های PDF. تو علم داده هم روش‌های یادگیری ماشین مبتنی بر درخت (مثل درخت تصمیم) خیلی معروفن و کلی از الگوریتم‌های قدرتمند پیش‌بینی، بر پایه همین درخت‌ها کار می‌کنن. مثلاً تو یه بازی مثل شطرنج، کامپیوتر یه درخت عظیم از تمام حرکت‌های ممکن می‌سازه تا بهترین حرکت رو انتخاب کنه.

می‌تونی با ترکیب ساختارهای داده‌ای که تا الان یاد گرفتی، خودت یه درخت بسازی. البته برای اینکه بحث خیلی پیچیده نشه، این موضوع رو تو یه آموزش مجزا بررسی می‌کنیم.

تا اینجا با آرایه‌ها و لیست‌ها آشنا شدی. با این حال پایتون یه سری ساختار دیگه هم داره که شاید تو کتاب‌های کلاسیک ساختمان داده بهشون اشاره‌ای نشه، ولی برای برنامه‌نویسی تو پایتون واقعاً واجبه که بشناسیشون:

  • تاپل‌ها (Tuples)
  • دیکشنری (Dictionary)
  • مجموعه‌ها (Sets)

تاپل‌ها

تاپل‌ها یکی دیگه از انواع داده‌های توالی تو پایتون هستن. فرق اصلی تاپل با لیست اینه که تاپل‌ها تغییرناپذیرن (Immutable)؛ یعنی وقتی یه بار ساختی‌شون، دیگه نمی‌تونی هیچ آیتمی رو ازشون حذف، اضافه یا ویرایش کنی. این ویژگی وقت‌هایی به درد می‌خوره که می‌خوای داده‌هات رو بدی دست یکی دیگه، اما نمی‌خوای تغییرشون بده؛ فقط بتونه بخوندشون یا یه کپی ازشون بگیره.

بیا ببینیم چطوری می‌شه تاپل ساخت:

خروجی
1
خروجی
Traceback (most recent call last):
  File "C:\Users\Finca\Desktop\test.py", line 2, in <module>
    x_tuple[0] = 0  # Cannot change values inside a tuple
TypeError: 'tuple' object does not support item assignment

دیکشنری

اگه بخوای چیزی شبیه به دفترچه تلفن بسازی، دیکشنری دقیقاً همون چیزیه که لازم داری. هیچ‌کدوم از ساختارهایی که تا الان دیدی برای این کار مناسب نیستن.

دیکشنری‌ها از جفت‌های کلید-مقدار (Key-Value) تشکیل شدن. key مثل اسم آدم تو دفترچه تلفن عمل می‌کنه و value هم شماره تلفنشه.

خروجی
{'Edward': 1, 'Jorge': 2, 'Prem': 3}
خروجی
1

پایتون متدهای آماده و کاربردی زیادی برای کار با دیکشنری‌ها در اختیارت گذاشته:

خروجی
3
خروجی
dict_keys(['Prem', 'Edward', 'Jorge'])
خروجی
dict_values([3, 1, 2])

این کدها نشون می‌دن که چطور می‌شه از دیکشنری برای ذخیره و دسترسی به اطلاعات استفاده کرد.

اول از همه، تابع len() تعداد جفت‌های کلید-مقدار رو برمی‌گردونه که تو این مثال عدد ۳ هست.

بعد متد keys() لیستی از کلیدها رو بهت می‌ده؛ یعنی 'Prem'، 'Edward' و 'Jorge'.

و در نهایت متد values() تمام مقادیر رو برمی‌گردونه؛ یعنی همون ۳، ۱ و ۲.

مجموعه‌ها

مجموعه‌ها تو پایتون شامل عناصر منحصربه‌فرد و بدون تکرارن. اگه بخوای یه دیتاست داشته باشی که توش هیچ داده تکراری نباشه، این ساختار عالیه. مجموعه‌ها ترتیب خاصی ندارن ولی تغییرپذیرن؛ قابلیتی که موقع کار با داده‌های خیلی حجیم حسابی به کارت میاد.

خروجی
{'A', '&', 'O', 'E', 'C', 'K'}
خروجی
{'I', 'O', 'E', 'C', 'K'}
خروجی
Traceback (most recent call last):
  File "C:\Users\YourName\Desktop\test.py", line 1, in <module>
    print(x - y)  # All the elements in x_set but not in y_set
NameError: name 'x' is not defined
خروجی
{'C', '&', 'E', 'A', 'O', 'K', 'I'}
خروجی
{'O', 'E', 'K', 'C'}

تو این قسمت دو تا مجموعه ساختیم: x_set و y_set. مجموعه x_set از رشته 'CAKE&COKE' ساخته شده و حروف 'A'، '&'، 'O'، 'E'، 'C' و 'K' رو تو خودش داره. مجموعه y_set هم از رشته 'COOKIE' ساخته شده و حروف 'I'، 'O'، 'E'، 'C' و 'K' رو داره.

تو مثال تفریق (که البته تو کد اشتباه نوشته شده بود و باید می‌شد x_set - y_set)، می‌تونیم عناصری که تو اولی هستن ولی تو دومی نیستن رو پیدا کنیم.

عملگر | بهمون اجتماع دو مجموعه رو می‌ده؛ یعنی همه حروف بدون تکرار کنار هم جمع می‌شن.

و در نهایت، عملگر & فقط حروفی رو برمی‌گردونه که تو هر دو تا کلمه مشترک بودن؛ یعنی 'O'، 'E'، 'K' و 'C'.

فایل‌ها

فایل‌ها هم به طور سنتی جزو ساختارهای داده به حساب میان. با اینکه تو علم داده خیلی با دیتابیس‌ها و داده‌های عظیم سروکار داریم، اما هر زبان برنامه‌نویسی باید بتونه اطلاعات رو تو فایل ذخیره کنه یا ازشون بخونه.

خوندن و نوشتن فایل تو پایتون شبیه زبان‌های دیگه‌ست، ولی خیلی راحت‌تره. اینجا چند تا از توابع اصلی برای کار با فایل‌ها رو می‌بینی:

  • open(): برای باز کردن فایل (باید اسم فایل رو بهش بدی)

  • read(): برای خوندن کل محتوای فایل یکجا

  • readline(): برای خوندن فایل خط به خط

  • write(): برای نوشتن یه متن تو فایل (تعداد کاراکترهای نوشته‌شده رو هم برمی‌گردونه)

  • close(): برای بستن فایلی که کارت باهاش تموم شده

ورودی دوم تو تابع open() همون حالت باز کردن فایله. اینطوری مشخص می‌کنی که آیا می‌خوای فقط فایل رو بخونی (r)، توش بنویسی (w)، به آخرش اضافه کنی (a) یا هم بخونی و هم بنویسی (r+).

برای یادگیری بیشتر درباره کار با فایل‌ها تو پایتون، حتماً این صفحه رو هم بخون.

نتیجه‌گیری

تبریک می‌گیم که تا آخر این آموزش با ما بودی! این مطالب باعث می‌شه یه قدم به تسخیر دنیای علم داده نزدیک‌تر بشی.

اگه علاقه‌مندی، پیشنهاد می‌کنیم دوره دو قسمتی جعبه ابزار علم داده پایتون فینکا رو ببینی که خیلی عمیق‌تر به توابع، پیمایشگرها، لیست‌ها و بقیه چیزها می‌پردازه.

اشتراک‌گذاری
فهرست مطالب
  • نوع داده انتزاعی و ساختارهای داده
  • ساختارهای داده اولیه
  • تبدیل نوع داده
  • ساختارهای داده غیر اولیه
  • نتیجه‌گیری

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.