فصل ۶: لیستها (Lists) در پایتون

لیستها (List) از پرکاربردترین انواع داده در پایتون هستند و بخش مهمی از برنامهنویسی عملی را تشکیل میدهند. با آشنایی عمیق با لیستها، میتوانید مجموعههایی از دادهها را بهسادگی مدیریت، ویرایش و پیمایش کنید؛ از کار با نمرات دانشآموزان گرفته تا ذخیرهسازی موجودی کالا و بسیاری کاربردهای دیگر.
۶.۱ | تعریف لیست و ساختار آن
لیست چیست؟
لیست یک مجموعه ترتیبی و قابل تغییر (mutable) از عناصر است که به وسیله براکت [] تعریف و عناصر آن با ویرگول از هم جدا میشوند.
مثال پایه:
# لیستی از اعداد
my_list = [1, 2, 3, 4, 5]
# لیستی از میوهها
fruits = ["سیب", "موز", "پرتقال"]
# لیستی با انواع داده متفاوت
mixed = [1, "دو", 3.0, True]
نکته:
در لیست میتوان هر نوع داده (عددی، متنی، منطقی و حتی لیست دیگر) را کنار هم قرار داد.
کاربرد عملی:
- جمعآوری پاسخهای آزمون
- لیست محصولات خرید
- ذخیرهسازی اطلاعات تماس
۶.۲ | دسترسی به عناصر لیست با ایندکس (Index)
در پایتون هر عنصر لیست یک شماره (ایندکس) دارد. این شمارهها از ۰ شروع میشود.
مثال دسترسی:
fruits = ["سیب", "موز", "پرتقال"]
print(fruits[0]) # سیب
print(fruits[1]) # موز
print(fruits[2]) # پرتقال
اندیس منفی:
میتوان با اندیس منفی از انتهای لیست شمارش کرد.
print(fruits[-1]) # پرتقال (آخرین عنصر)
print(fruits[-2]) # موز
اشتباه رایج:
دسترسی با ایندکس خارج از محدوده لیست (IndexError):
print(fruits[3]) # خطا، چون عناصر فقط تا اندیس 0،1،2 هستند
تمرین ۱:
لیستی از اعداد بسازید و مقدار سوم و آخرین عدد را چاپ کنید.
پاسخ پیشنهادی:
numbers = [5, 17, 8, 22, 43]
print(numbers[2]) # عنصر سوم
print(numbers[-1]) # آخرین عنصر
۶.۳ | افزودن، حذف و ویرایش عناصر لیست
۱. افزودن یک عنصر:
از متد append() برای افزودن در انتهای لیست استفاده میشود.
fruits = ["سیب", "موز", "پرتقال"]
fruits.append("گلابی")
print(fruits) # ['سیب', 'موز', 'پرتقال', 'گلابی']
۲. افزودن چند عنصر با هم (گسترش لیست):
از متد extend() برای افزودن چندین عنصر استفاده کنید:
fruits.extend(["هلو", "زردآلو"])
print(fruits)
۳. درج در محل خاص:
با متد insert() میتوانید هر عنصر را در ایندکس دلخواه درج کنید:
fruits.insert(1, "آلبالو") # درج "آلبالو" در مکان دوم (ایندکس 1)
print(fruits)
۴. حذف یک عنصر:
با remove() اگر مقدار را میدانید، حذف میکند:
fruits.remove("موز")
print(fruits)
با del اگر ایندکس را میدانید:
del fruits[0]
print(fruits)
متد pop() هم با ایندکس دلخواه عنصر را حذف کرده و آن را برمیگرداند:
removed_item = fruits.pop(1)
print(removed_item)
نکته:
اگر بخواهید همه عناصر لیست را پاک کنید:
fruits.clear()
print(fruits)
۵. ویرایش عنصر:
کافی است با ایندکس به عنصر دسترسی پیدا کنید و مقدار جدید جایگزین نمایید:
fruits[0] = "آلبالو"
print(fruits)
تمرین ۲:
لیستی شامل سه نام بسازید، سپس نام دوم را با نام جدید جایگزین کنید، و سپس نام آخر را حذف نمایید.
پاسخ پیشنهادی:
names = ["علی", "رضا", "نگین"]
names[1] = "زهرا"
del names[-1]
print(names) # خروجی: ['علی', 'زهرا']
اشتباهات رایج:
- حذف عنصری که وجود ندارد: خطای ValueError در remove
- دسترسی به ایندکس اشتباه با del یا assignment
- فراموشی اینکه ایندکسها از ۰ شروع میشوند
۶.۴ | طول لیست و بررسی خالی بودن
گرفتن طول لیست:
با تابع len() میتوانید تعداد عناصر لیست را بیابید.
fruits = ["سیب", "موز", "پرتقال"]
print(len(fruits)) # خروجی: 3
تست خالی بودن لیست:
یک لیست زمانی تهی است که تعداد عناصرش صفر باشد. بررسی میکنیم:
if not fruits:
print("لیست خالی است.")
else:
print("لیست شامل عناصر است.")
تمرین ۳:
یک لیست خالی تعریف کنید، سپس با append سه عنصر به آن بیفزایید و در انتها طول لیست و مقدار عناصر را چاپ کنید.
پاسخ پیشنهادی:
items = []
items.append("کتاب")
items.append("دفتر")
items.append("تراش")
print("تعداد آیتمها:", len(items))
print("لیست:", items)
۶.۵ | پیمایش (حلقه for) بر روی لیستها
لیستها بسیار مناسب پیمایش و اجرای عملیات روی تمام اعضا هستند.
میتوان با حلقه for، همه عناصر را یکی یکی برداشت و مثلاً چاپ یا پردازش کرد.
مثال ساده:
fruits = ["سیب", "موز", "پرتقال"]
for fruit in fruits:
print("من دارم:", fruit)
پیمایش همراه با ایندکس:
گاهی به شماره هر عنصر هم نیاز داریم. از تابع enumerate() استفاده کنید:
for idx, fruit in enumerate(fruits):
print(f"عنصر شماره {idx+1}: {fruit}")
روی رشتهها هم عمل میکند:
for ch in ['پ', 'ا', 'ی', 'ت', 'و', 'ن']:
print(ch)
تمرین ۴: (تمرین کاربردی)
برنامهای بنویسید که از کاربر پشت سر هم نام چند میوه بخواهد (تا کاربر یک رشته خالی بزند)، همگی را در لیستی ذخیره کند و در پایان، تمامی میوهها را چاپ نماید.
پاسخ پیشنهادی:
fruits = []
while True:
fruit = input("نام یک میوه (برای توقف Enter را بزن): ")
if fruit == "":
break
fruits.append(fruit)
print("لیست میوههای وارد شده:")
for item in fruits:
print(item)
۶.۶ | سوالات متداول (FAQ) فصل ششم
۱. تفاوت لیست و رشته چیست؟
رشته مجموعهای از کاراکترهاست (تغییرناپذیر)، اما لیست مجموعهای از انواع مختلف داده است (قابل تغییر و افزودن/حذف).
۲. اگر لیست تو در تو بسازیم چطور به عناصر لیست داخلی دست پیدا کنیم؟
با دوبار اندیسدهی:
matrix = [[1,2,3], [4,5,6]]
print(matrix[1][2]) # خروجی: 6
۳. چگونه میتوان همه مقادیر خاص را از لیست حذف کرد؟
از remove در یک حلقه استفاده کنید (یا لیست جدید با شرط مناسب بسازید):
nums = [1, 2, 3, 2, 4]
while 2 in nums:
nums.remove(2)
print(nums) # خروجی: [1, 3, 4]
۴. فرق append و extend چیست؟
- append یک عنصر را به ته لیست اضافه میکند.
- extend لیست اصلی را با عناصر لیست جدید گسترش میدهد.
۶.۷ | اشتباهات متداول و نکات حرفهای
- فراموشی ایندکس صفر (اولین عنصر): همیشه [0] اولین عضو است.
- حذف عنصر با remove وقتی آن عنصر در لیست وجود ندارد خطا میدهد.
- اشتباه بین append و extend
- حواستان باشد که لیست در پایتون قابل تغییر است؛ هر تغییری روی مقدار اصلی میماند.
- اگر لیست تو در تو دارید، مثلا matrix[1][2] به سطر دوم (اندیس ۱) و ستون سوم (اندیس ۲) اشاره میکند.
نکته امنیتی:
اگر اطلاعات حساس دارید، بعد از پاک کردن لیست، با del خود لیست را هم پاک کنید:
del items
۶.۸ | تمرین چالشی (ترکیبی)
برنامهای بنویسید که:
۱. از کاربر تعدادی نام دریافت کند (تا زمانی که \”پایان\” نوشته شود).
۲. پس از پایان، همه نامها را به صورت لیست چاپ کند.
۳. اگر نامی تکراری وارد شد، فقط یکبار ذخیره شود (تکراری نباشد).
پاسخ پیشنهادی:
names = []
while True:
name = input("یک نام وارد کن (برای پایان 'پایان' بنویس): ")
if name == "پایان":
break
if name not in names:
names.append(name)
print("لیست نهایی اسامی:")
for n in names:
print(n)
جمعبندی
لیستها پایه مدیریت دادههای دستهایاند؛ با یادگیری تعریف، افزودن، حذف، ویرایش، پیمایش و کنترل آنها بخش بزرگی از نیازهای برنامهنویسی ابتدایی و حتی حرفهای شما رفع میشود.