لیست در پایتون چیست؟ list در پایتون به زبان ساده
بررسی نوع داده List در پایتون + تکنیکهای کاربردی کار با لیست
آموزش لیست در پایتون یکی از پر کاربردترین نوع دادهای است که تقریباً در تمام برنامههای خود از آن استفاده میکنیم. اگر بتوانیم در کار با لیست پایتون به مهارت کافی برسیم، روند برنامه نویسی ما سرعت بیشتری خواهد گرفت. همچنین خواهیم توانست کارهای بعضاً خارق العادهای انجام دهیم! در این مقاله به بررسی نوع داده List در پایتون، آموزش کار با آن، توابع مهم و تکنیکهای کاربردی کار با لیست خواهیم پرداخت.
اگر تا به حال حتی یک خط برنامه نویسی کرده باشید، حتماً برایتان سوال شده که چگونه میتوان تعداد بسیار زیادی داده را در برنامه نگهداری کرد؟ فرض کنید بخواهیم نمرات یک دانشجو را در برنامه خود وارد کرده و روی آن پردازشهایی انجام دهیم. اگر بخواهیم برای هر درس این دانشجو یک متغیر در نظر بگیریم، برنامه بسیار پیچیده خواهد شد! از طرفی تعداد دروس دانشجو مشخص نیست و ما نمیدانیم چه تعداد متغیر باید در نظر بگیریم.
به کمک لیستها خواهیم توانست تعداد مقادیر زیادی را در یک متغیر نگه داشته و حتی روی آن عملیاتهای مختلفی را اجرا کنیم. اگر با زبانهای برنامه نویسی مختلف کار کرده باشید، احتمالاً با آرایهها آشنایی دارید. در یک تعریف بسیار کلی میتوان لیست را یک نوع آرایه در پایتون دانست؛ آرایهای که طول آن متغیر بوده و عناصر آن میتوانند از انواع مختلف دادهای باشند.
لیست یک ساختمان داده مهم در پایتون است. به کمک لیستها میتوانیم دنبالهای از دادهها را در یک متغیر ذخیره کرده و روی آنها عملیاتهای مختلفی را اجرا کنیم. هر عنصر درون لیست به وسیله کاما (ویرگول انگلیسی یا comma) به شکل , از یکدیگر جدا شده و میتواند از هر نوع داده دلخواهی باشد.
lst = [“Omid”, 217, 22.5, “SabzDnaesh”]
در یک خط کد بالا، یک لیست با نام lst ایجاد کردهایم. سپس درون آن چهار مقدار با نوع دادهای مختلف قرار دادهایم. به همین راحتی!
کاربرد لیست
از لیست در هر جایی که بخواهید میتوانید استفاده کنید! هر کجا که دنبالهای معنیدار یا بدون معنی از دادهها دارید، لیستها سریعترین و شاید بهترین انتخاب شما باشند. مزیت لیستها در پایتون این است که به سادگی تعریف شده، اعضای آن اضافه یا کم میشوند. همچنین اعمال بین لیستها بسیار ساده و سریع است. در ادامه توابع و تکنیکهایی به شما معرفی میکنیم که به راحتی هر بلایی که خواستید سر لیستها در بیاورید!
دسترسی به اعضای لیست در پایتون
همانطور که پیشتر نیز در مقاله w3schools گفته شد، سادهترین نوع تعریف یک لیست در پایتون، استفاده از دو علامت کروشه در کنار هم است.
با این تعریف، متوجه خواهید شد که امکان ایجاد یک لیست خالی نیز وجود دارد. در نتیجه حتماً نیازی نیست که در ابتدای کار تمام مقادیر درون لیست را داشته باشیم؛ بلکه در حین برنامه خواهیم توانست مقادیر دلخواه خود را به آن اضافه یا از آن کم کنیم.
دسترسی به اعضای لیست بر اساس اندیسهای آن صورت میگیرد. اندیسها اعدادی هستند که موقعیت هر عنصر در لیست را مشخص میکنند.
اولین عنصر یک لیست دارای اندیس صفر (0) و به طور کلی nاُمین عنصر دارای اندیس n-1 خواهد بود.
اندیس لیست (ایندکس یا نمایه)
فرض کنید یک لیست از اسامی افراد مختلف را درون لیست خود داریم.
lst = [“sara”, “omid”, “amir”, “roya” ,”ehsan”]
برای دسترسی به هر عنصر از لیست، با داشتن موقعیت یا اندیس آن عنصر و آوردن اندیس در جلوی نام متغیر لیست، به عنصر مورد نظرمان دسترسی خواهیم داشت.
یعنی قطعه کد زیر به ما عنصری که در اندیس شماره 3 قرار دارد با خروجی میدهد؛ یعنی چهارمین عنصر در لیست که معادل roya است.
lst[3]
به همین سادگی خواهیم توانست به تمام عناصر درون یک لیست دسترسی پیدا کنیم.
توجه کنید که اندیس یک مقدار از نوع عددی صحیح (integer) است. در نتیجه فراخوانی اندیس اعشاری یا رشتهای ما را با خطا مواجه خواهد کرد.
در لیست بالا ما پنج عنصر داریم. بازه اندیسهای ما از 0 تا 4 خواهد بود. وارد کردن عددی بزرگتر از 4 ما را با خطای اندیس
روش ساخت نوع داده لیست در پایتون
در برنامهنویسی پایتون، نوع داده لیست با قرار دادن همه آیتمها (عناصر) درون یک براکت (کمانک) یعنی [ ]، ساخته میشود. عناصر یک لیست، با استفاده از علامت ویرگول، یعنی «,»، از هم جدا میشوند. لیست میتواند هر تعدادی عنصر داشته باشد و این عناصر ممکن است خود دارای انواع داده متفاوتی باشند. برای مثال، عناصر یک لیست ممکن است ترکیبی از نوع داده «صحیح» (integer)، «شناور» (float) و «رشته» (String) باشند. در کد زیر، مثالهایی پیرامون روش ساخت لیست آورده شده است.
# empty listmy_list = [] # list of integersmy_list = [1, 2, 3] # list with mixed datatypesmy_list = [1, “Hello”, 3.4]
در خط اول کد، یک لیست خالی ساخته شده است. از این مثال میتوان فهمید که امکان ساختن لیست خالی در پایتون وجود دارد. در مثال دومی که در همین قطعه کد موجود است، یک لیست با سه عنصر ۱، ۲ و ۳ که هر سه دارای نوع داده عدد صحیح (int) هستند، ساخته شده است. در آخرین خط کد، یک لیست با سه عنصر ۱ (نوع داده عدد صحیح)، “Hello” (رشته) و ۳.۴ (ممیز شناور) ساخته شده است.
همانطور که از این مثال به خوبی مشهود است، نوع داده لیست در پایتون میتواند حاوی عناصری با انواع گوناگون باشد. همچنین، یک لیست میتواند شامل یک لیست دیگر باشد. به این موضوع، «لیست تو در تو» (Nested List) گفته میشود. مثالی از لیست تو در تو، در ادامه آمده است.
# nested listmy_list = [“mouse”, [8, 4, 6], [‘a’]]
[‘a’] و [8, 4, 6] خود دو لیست مجزا و “mouse” یک رشته است. کلیه این موارد به عنوان عنصرهای لیست my_list در آن قرار گرفتهاند و به این صورت، یک لیست تو در تو ایجاد شده است. در واقع لیستی وجود دارد که خود شامل دو لیست دیگر است.
روش دسترسی داشتن به عناصر یک لیست
راهکارهای مختلفی برای دسترسی به عناصر یک لیست وجود دارد. در ادامه، هر یک از این موارد تشریح شدهاند.
اندیس لیست
میتوان از عملگر «اندیس» (Operator) یعنی []، برای دسترسی داشتن به یک عنصر از لیست، استفاده کرد. اندیس لیستها در پایتون از عدد ۰ شروع میشود. دانستن این نکته بسیار حائز اهمیت است، زیرا در برخی از زبانها مانند «جولیا» (Julia)، «فرترن» (Fortran)، ، «اِرلنگ» (Erlang) و «اسمالتاک» (Smalltalk) اندیس آرایه از عدد ۱ شروع میشود. البته، در اغلب زبانهای محبوب، مانند ، ، ، «پرل» (Perl) و ، اندیس آرایه از صفر شروع میشود.
بنابراین، برای لیستی که حاوی ۵ عنصر است، اندیس لیست از ۰ تا ۴ است. تلاش برای دسترسی به اندیسهایی که وجود ندارند، موجب IndexError (خطای اندیس) میشود. اندیس باید یک مقدار صحیح (int) باشد. نمیتوان از نوع داده شناور یا دیگر انواع برای اندیس لیست استفاده کرد؛ انجام چنین کاری، موجب TypeError (خطای نوع) میشود. برای دسترسی داشتن به عناصر لیست تو در تو، باید از اندیس دهی تو در تو استفاده کرد. در ادامه، مثالهای پیرامون نحوه استفاده از اندیس برای دسترسی به محتوای نوع داده لیست در پایتون، ارائه شده است.
my_list = [‘p’,’r’,’o’,’b’,’e’]# Output: pprint(my_list[0]) # Output: oprint(my_list[2]) # Output: eprint(my_list[4]) # Error! Only integer can be used for indexing# my_list[4.0] # Nested Listn_list = [“Happy”, [2,0,1,5]] # Nested indexing # Output: aprint(n_list[0][1]) # Output: 5print(n_list[1][3])
در قطعه کد بالا، ابتدا یک لیست با عنوان my_list ساخته شده که دارای ۵ عنصر از نوع داده رشته است. چنانچه پیشتر بیان شد، اندیس نوع داده لیست در پایتون، از عدد صفر شروع میشود. بنابراین، برای این لیست که دارای ۵ عنصر است، اندیس از عدد صحیح ۰ شروع میشود و تا ۴ ادامه دارد. با استفاده از دستور [my_list[0، دسترسی به اولین عنصر لیست انجام شده و با استفاده از تابع ()print، خروجی (p) چاپ شده است. با استفاده از کد ([print(my_list[2، به عنصر سوم لیست (دارای اندیس ۲) دسترسی ایجاد شده و با استفاده از تابع ()print مقدار (o) آن چاپ شده است. در نهایت، کد ([print(my_list[4 عنصر پنجم لیست، یعنی e را چاپ میکند.
در مثال دیگری که در همین قطعه کد موجود است، لیستی با عنوان n_list تعریف شده که حاوی یک رشته (Happy) و یک لیست دیگر ([2,0,1,5]) است. در واقع، n_list یک لیست تو در تو است. اکنون، با استفاده از اندیسدهی تو در تو، به عناصر لیست دسترسی ایجاد میشود. [n_list[0][1 یعنی از عنصر با اندیس 0 در لیست (اولین عنصر موجود در لیست که یک رشته است)، دومین بخش (اندیس یک) را بازگردان. بنابراین، خروجی برابر با a خواهد بود. شایان توجه است که در صورت وجود رشته در لیست، میتوان به تک تک کاراکترهای آن، به شیوه بیان شده، دسترسی پیدا کرد.
با استفاده از دستور ([print(n_list[1][3، از عنصر دوم لیست (که خود یک لیست دیگر است)، عنصر چهارم (دارای اندیس ۳) بازگردانده و در خروجی چاپ میشود. در واقع، [1] به جایگاه عنصر در لیست اصلی و [3] به جایگاه عنصر در لیستی که داخل لیست اصلی قرار گرفته، اشاره دارد
تولید لیست با تابع list()
علاوه بر روش های بالا، شما می توانید با استفاده از تابع سازنده list()، نیز لیست خود را ایجاد کنید. هم چنین با این تابع می توانید انواع داده های دیگر مثل دیکشنری ، تاپل، set و رشته را به یک لیست تبدیل کنید.
تغییر دادن آیتم های یک لیست
لیست ها برخلاف رشته و تاپل ها ، نوع داده تغییر پذیر هستند به این معنا که می توان عناصر آن ها را تغییر داد و یا آیتم هایی را به آن ها اضافه نمود.
شما می توانید برای تغییر دادن یک آیتم یا رنجی از آیتم های یک لیست از عملگر انتساب = استفاده کنید. مثلا در قطعه کد زیر می بینید لیستی که قرار بود اعداد فرد در آن قرار بگیرد به اشتباه، حاوی اعداد زوج است لذا ما در دو مرحله، با استفاده از عملگر انتساب همه آن ها را به اعداد فرد تغییر داده ایم.
اضافه کردن عناصر به لیست
برای اضافه کردن عناصر جدید به یک لیست می توانید از یکی از دو تابع append() و یا extend() استفاده کنید. تنها تفاوت این دو تابع در تعداد آیتم هایی است که قرار است به لیست اضافه کنید. به عبارت دیگر برای اضافه کردن یک آیتم باید از تابع append() و برای اضافه کردن چندین آیتم از تابع extend() استفاده کنید.
درحقیقت از تابع extend() برای اضافه کردن عناصر یک رشته، تاپل، دیکشنری و یا لیست دیگر به انتهای لیست جاری استفاده می شود.
نحوه دسترسی به اعضای لیست
برای دسترسی به اعضای یک لیست، نام لیست را به همراه علامت براکت[] که حاوی اندیس مورد نظر است می نویسیم. در لیست ها هم مشابه آرایه ها، اندیس ها عدد صحیح هستند و از عدد صفر شروع می شوند. بنابراین اگر بخواهید به عنصر دوم لیست، دسترسی پیدا کنید باید از اندیس 1 استفاده کنید.
تلاش برای دسترسی به اندیسی از لیست که اصلا وجود ندارد منجر به تولید خطای IndexError می شود. علاوه بر این شما نمی توانید به جز عدد صحیح، از یک عدد اعشاری یا هر نوع داده دیگری به عنوان اندیس یک لیست استفاده کنید چرا که با خطای TypeError مواجه می شوید.
دسترسی از طریق اندیس منفی
پایتون به شما اجازه می دهد که برای دسترسی به عناصر یک لیست یا یک رشته از اندیس منفی هم استفاده کنید. در این شیوه، اندیس -1 به آخرین آیتم لیست و -2 به آیتم ماقبل آخر لیست اشاره می کند.
اگر برای دسترسی به عناصر لیست، از اندیس منفی استفاده کنید، پایتون عناصر لیست را از آخر به اول و به صورت معکوس پیمایش می کند.
نحوه بخش بندی (slicing) و برش یک لیست
با استفاده از عملگر برش (علامت کولن : ) ، می توان بخش هایی از یک لیست را استخراج نمود. طریقه استفاده از این عملگر، قبلا به طور مفصل در مقاله “” تشریح شده است.
دسترسی به تمامی عناصر یک لیست
باز هم مشابه رشته ها می توان با استفاده از حلقه for ابتدا تا انتهای یک لیست را پیمایش نموده و به تمامی اعضای آن دسترسی پیدا کرد.
کاربرد دو عملگر + و * در لیست ها
کاری که این دو عملگر در لیست انجام می دهند دقیقا مشابه کاری است که در مورد رشته ها انجام می دادند. یعنی عملگر + برای الحاق بیش از یک لیست با هم بکار میرود و عملگر * هم یک لیست را به تعداد دفعات مشخص شده تکرار می کند.
کاربرد تابع insert
شما می توانید با استفاده از این تابع، عنصری را در مکان مورد نظر خود در یک لیست درج کنید. برای درج چندین آیتم در یک لیست هم می توان توسط عملگر slice : عناصر مورد نظر را در یک slice خالی از لیست گنجاند.
مهم ترین توابع درون ساخته قابل استفاده در لیست ها
برای یافتن بزرگ ترین و کوچک ترین عنصر یک لیست نیز می توان مشابه رشته ها، به ترتیب از توابع max و min استفاده کرد. اگر لیست ما حاوی اعداد باشد طرز کار این تابع کاملا مشخص است. اما اگر لیست ما حاوی چندین رشته یا کاراکتر باشد ملاک بزرگ تری و کوچک تری را ترتیب حروف الفبا (ترتیب اولین حرف رشته ها) مشخص خواهد کرد.
علاوه بر این، برای محاسبه مجموع عناصر لیست های عددی از تابع sum() ، برای محاسبه تعداد آیتم های یک لیست از تابع len() و برای مرتب سازی یک لیست از تابع sorted استفاده می شود.
تابع count تعداد تکرار عنصر مشخص شده را در لیست مربوطه برمی گرداند.
تابع reverse یک لیست را معکوس می کند.
تابع sort یک لیست را براساس حروف الفبا یا از کوچک تر به بزرگ تر مرتب می کند.
تابع index() نیز اولین آیتمی از لیست را که اندیسش برابر آرگومان این تابع است برمی گرداند. منظور از کلمه “اولین”، برای زمان هایی است که لیست دارای عناصر تکراری هم باشد. مثلا همانطور که در مثال زیر می بینید با این که در لیست زیر چندین نمونه از اعداد 2 و 3 و 7 وجود دارد اما تابع index تنها اندیس اولین داده متناظر را برمی گرداند.
تست عضویت در لیست ها
برای بررسی وجود یا عدم وجود عنصری در یک لیست، از عملگرهای عضویت in و عدم عضویت not in استفاده می کنیم. در بخش عملگرها به طرز کار این دو تابع اشاره گردیده است. اما با دقت در مثال زیر هم می توانید به راحتی به ماهیت این دو عملگر پی ببرید.
حذف داده های یک لیست با توابع remove() و pop()
- برای حذف داده های یک لیست کافی است از تابع remove استفاده کرده و عنصر مورد نظر را به عنوان آرگومان به این تابع ارسال کنیم.
- تابع pop() نیز آخرین عنصر یک لیست را حذف کرده و برمیگرداند. این تابع کمک می کند که لیست ها را به صورت ساختمان داده پشته (stack) که در آن آخرین ورودی، اولین خروجی (LIFO) بود پیاده سازی کنیم.
- برای حذف تمامی عناصر یک لیست و در حقیقت خالی کردن لیست هم باید از تابع clear استفاده کنید. در مثال زیر، ملاحظه می کنید که این تابع عملکردی مشابه عبارت del std[:] دارد.
- علاوه بر این، با انتساب یک لیست خالی به بخشی از یک لیست هم می توان، عناصر مربوط به آن بخش را حذف نمود.
حذف عنصری از لیست با کلمه کلیدی del
علاوه بر توابع remove() و pop() از کلمه کلیدی del هم می توان برای حذف یک یا چند آیتم یک لیست استفاده نمود.
حذف خود لیست
از کلمه کلیدی del می توان برای پاک کردن یک لیست هم استفاده کرد. می بینید که اگر بخواهیم پس از حذف لیستی به آن دسترسی پیدا کنیم با خطای NameError مواجه می شویم. چرا که دیگر وجود ندارد.
نحوه ایجاد لیست با List Comprehension
در این شیوه شما می توانید به جای ایجاد و مقدار دهی دستی یک لیست، عبارت محاسباتی یا همان فرمول تولید عناصر لیست خود را به همراه یک حلقه for در داخل علامت براکت بنویسید. مثلا در قطعه کد زیر می بینید که ما به همین شیوه، تعدادی از توان های عدد 2 و نیز توان دوم اعداد 0 تا 9 را در قالب دو لیست مجزا تولید کرده ایم.
سه تمرین با استفاده از لیست ها
· برنامه محاسبه مجموع دو ماتریس دو بعدی
در این برنامه قرار است شما دو ماتریس دو بعدی را توسط لیست های تودرتو با یکدیگر جمع کنید. برای این کار باید علاوه بر لیست ها با حلقه های تکرار مخصوصا حلقه for هم آشنا باشید.
حقیقت این است که ما در پایتون می توانیم هر ماتریس را توسط یک لیست تو در تو ( لیستی درون لیستی دیگر) پیاده سازی کنیم و هر عنصر از این لیست تودرتو، یک ردیف از ماتریس ما خواهد بود.
به عنوان مثال لیست X = [[1, 2], [4, 5], [3, 6]] یک ماتریس 2*3 (دارای 3 ردیف و دو ستون) را نشان می دهد. هم چنین x[0] نشان دهنده اولین ردیف این ماتریس و x[0][0] نشان دهنده داده ای است که در اولین ستون از ریف اول قرار دارد.
· برنامه به دست آوردن معکوس یک ماتریس
علاوه بر این، با استفاده از لیست های تودرتو ، می توانید معکوس یک ماتریس را هم به دست بیاورید. معکوس یک ماتریس، ماتریسی است که جای سطر و ستون های آن عوض شده است. مثلا داده ای که در ماتریس x در ردیف i ام و ستون j ام قرار داشت در ماتریس معکوس x، در ردیف j ام و ستون i ام قرار می گیرد.
· برنامه حذف عناصر تکراری از یک لیست
شما می توانید با تلفیق آموخته های خود راجب نوع داده دیکشنری و لیست ها این کار را به راحتی انجام دهید. مثلا فرض کنید لیستی همانند لیست زیر داریم و می خواهیم نمونه های تکراری عناصر لیست را حذف کنیم.
mylist = [“a”, “b”, “a”, “c”, “c”]
برای این کار کافیست از تابع fromkeys() مبحث دیکشنری ها کمک بگیریم. این تابع یک لیست، رشته، تاپل و یا set را به عنوان آرگومان خود دریافت کرده و دیکشنری جدیدی ایجاد می کند. به طوری که کلیدهای دیکشنری جدید، همان عناصر رشته یا لیست مورد نظر هستند و همه مقادیر هم برابرند با None.
این دیکشنری جدید تمامی عناصر تکراری لیست قبلی را به صورت خودکار حذف می کند چرا که دیکشنری ها نمی توانند اعضای تکراری داشته باشند. حال برای حفظ کلیدها و حذف مقادیر آن ها می توانیم مجددا دیکشنری تولید شده را توسط تابع list() به یک لیست تبدیل کنیم. کار تمام است!
امیدواریم آموزش های این مقاله شما را با تعریف لیست ها و طرز ایجاد آن در پایتون آشنا کرده باشد. هم چنان با ما همراه باشید.