لیستها در پایتون؛ ساخت، دسترسی و تغییر عناصر

🗓 آخرین بهروزرسانی:
لیست یکی از پرکاربردترین ساختارهای داده در پایتون است. با استفاده از لیست میتوان چند مقدار را در یک متغیر نگهداری کرد؛ برای مثال نام محصولات، نمرههای دانشآموزان، کارهای روزانه یا مجموعهای از قیمتها. سپس میتوان به عناصر دسترسی داشت، آنها را تغییر داد، مقدار جدید اضافه کرد یا عناصر اضافی را حذف کرد.
این مطلب، درس یازدهم از دوره رایگان آموزش پایتون از صفر است. در درس قبلی با حلقه while آشنا شدیم. اکنون ساختاری را یاد میگیریم که نگهداری و پردازش چند مقدار مرتبط را بسیار سادهتر میکند.
لیست در پایتون چیست؟
لیست یا list مجموعهای مرتب از مقدارهاست که داخل کروشه قرار میگیرند و با ویرگول از یکدیگر جدا میشوند:
fruits = ["سیب", "موز", "پرتقال"]
print(fruits)خروجی:
['سیب', 'موز', 'پرتقال']در این مثال، متغیر fruits بهجای یک مقدار، سه مقدار متنی را نگهداری میکند.
ویژگیهای اصلی لیستها
- مرتب هستند: ترتیب عناصر حفظ میشود.
- قابل تغییر هستند: میتوان عناصر را اضافه، حذف یا جایگزین کرد.
- مقدار تکراری میپذیرند: یک مقدار میتواند چند بار داخل لیست وجود داشته باشد.
- میتوانند انواع داده متفاوت داشته باشند: متن، عدد و مقدار بولی میتوانند در یک لیست قرار بگیرند.
data = ["مهران", 30, 18.5, True]
print(data)با وجود امکان ترکیب انواع داده، معمولاً بهتر است عناصر یک لیست هدف مشترکی داشته باشند تا کد خواناتر باقی بماند.
ساخت لیست در پایتون
سادهترین راه ساخت لیست استفاده از کروشه است:
numbers = [10, 20, 30, 40]
names = ["علی", "سارا", "رضا"]
prices = [49.9, 120.0, 85.5]ساخت لیست خالی
گاهی ابتدا یک لیست خالی میسازیم و بعداً مقدارها را به آن اضافه میکنیم:
shopping_list = []
print(shopping_list)همچنین میتوان از تابع list() استفاده کرد:
tasks = list()هر دو روش یک لیست خالی ایجاد میکنند.
تشخیص نوع لیست با type
colors = ["قرمز", "آبی", "سبز"]
print(type(colors))خروجی:
<class 'list'>دسترسی به عناصر لیست با اندیس
هر عنصر در لیست یک شماره جایگاه یا index دارد. شمارهگذاری از صفر آغاز میشود:
fruits = ["سیب", "موز", "پرتقال"]
print(fruits[0])
print(fruits[1])
print(fruits[2])خروجی:
سیب
موز
پرتقالبنابراین نخستین عنصر اندیس صفر، دومین عنصر اندیس یک و سومین عنصر اندیس دو دارد.
اندیس منفی
اندیسهای منفی از انتهای لیست شمارش میشوند:
fruits = ["سیب", "موز", "پرتقال"]
print(fruits[-1])
print(fruits[-2])خروجی:
پرتقال
موزاندیس -1 آخرین عنصر و اندیس -2 عنصر پیش از آخر را برمیگرداند.
خطای IndexError چیست؟
اگر اندیسی خارج از محدوده لیست درخواست شود، پایتون خطای IndexError ایجاد میکند:
fruits = ["سیب", "موز", "پرتقال"]
print(fruits[5])IndexError: list index out of rangeاین لیست فقط سه عنصر دارد؛ بنابراین اندیسهای معتبر آن صفر، یک و دو هستند.
تعداد عناصر لیست با len
fruits = ["سیب", "موز", "پرتقال"]
print(len(fruits))خروجی:
3برای دسترسی امن به آخرین عنصر نیز میتوان از اندیس -1 استفاده کرد:
last_fruit = fruits[-1]برش لیست با slicing
برش یا slicing امکان دریافت بخشی از لیست را فراهم میکند. ساختار عمومی آن چنین است:
list_name[start:stop:step]مقدار شروع داخل برش قرار میگیرد، اما مقدار پایان داخل محدوده نیست.
numbers = [10, 20, 30, 40, 50, 60]
print(numbers[1:4])خروجی:
[20, 30, 40]حذف مقدار شروع یا پایان
numbers = [10, 20, 30, 40, 50, 60]
print(numbers[:3])
print(numbers[3:])خروجی:
[10, 20, 30]
[40, 50, 60]برش با گام
numbers = [0, 1, 2, 3, 4, 5, 6]
print(numbers[::2])خروجی:
[0, 2, 4, 6]معکوسکردن لیست با slicing
numbers = [1, 2, 3, 4, 5]
print(numbers[::-1])خروجی:
[5, 4, 3, 2, 1]تغییر یک عنصر لیست
لیستها قابل تغییر یا mutable هستند. برای جایگزینی یک عنصر، اندیس آن را در سمت چپ علامت مساوی قرار میدهیم:
fruits = ["سیب", "موز", "پرتقال"]
fruits[1] = "هلو"
print(fruits)خروجی:
['سیب', 'هلو', 'پرتقال']تغییر چند عنصر با برش
numbers = [1, 2, 3, 4, 5]
numbers[1:3] = [20, 30]
print(numbers)خروجی:
[1, 20, 30, 4, 5]تعداد عناصر جایگزین میتواند با تعداد عناصر قبلی متفاوت باشد:
numbers = [1, 2, 3, 4]
numbers[1:3] = [20, 30, 40]
print(numbers)خروجی:
[1, 20, 30, 40, 4]افزودن عنصر با append
متد append() یک مقدار را به انتهای لیست اضافه میکند:
tasks = ["مطالعه"]
tasks.append("تمرین پایتون")
tasks.append("پیادهروی")
print(tasks)خروجی:
['مطالعه', 'تمرین پایتون', 'پیادهروی']افزودن عنصر در جایگاه مشخص با insert
متد insert() مقدار را در اندیس مشخص قرار میدهد:
fruits = ["سیب", "پرتقال"]
fruits.insert(1, "موز")
print(fruits)خروجی:
['سیب', 'موز', 'پرتقال']عنصرهای موجود به سمت راست منتقل میشوند و حذف نمیشوند.
افزودن چند عنصر با extend
متد extend() عناصر یک داده قابل پیمایش را به انتهای لیست اضافه میکند:
first_list = [1, 2, 3]
second_list = [4, 5, 6]
first_list.extend(second_list)
print(first_list)خروجی:
[1, 2, 3, 4, 5, 6]تفاوت append و extend
numbers = [1, 2]
numbers.append([3, 4])
print(numbers)خروجی:
[1, 2, [3, 4]]در این حالت، فهرست دوم بهعنوان یک عنصر واحد اضافه میشود. اما extend() عناصر آن را جداگانه وارد میکند:
numbers = [1, 2]
numbers.extend([3, 4])
print(numbers)[1, 2, 3, 4]ترکیب دو لیست با عملگر +
list_one = [1, 2]
list_two = [3, 4]
combined = list_one + list_two
print(combined)این روش یک لیست جدید تولید میکند و دو لیست اصلی را تغییر نمیدهد.
تکرار عناصر لیست با عملگر *
values = [0] * 5
print(values)خروجی:
[0, 0, 0, 0, 0]حذف عنصر براساس مقدار با remove
متد remove() نخستین رخداد مقدار مشخصشده را حذف میکند:
fruits = ["سیب", "موز", "سیب", "پرتقال"]
fruits.remove("سیب")
print(fruits)خروجی:
['موز', 'سیب', 'پرتقال']اگر مقدار موردنظر در لیست وجود نداشته باشد، خطای ValueError ایجاد میشود. بهتر است ابتدا وجود آن را بررسی کنید:
if "موز" in fruits:
fruits.remove("موز")حذف عنصر براساس اندیس با pop
متد pop() عنصر مشخصشده را حذف و همان مقدار را برمیگرداند:
fruits = ["سیب", "موز", "پرتقال"]
removed_item = fruits.pop(1)
print("حذفشده:", removed_item)
print("لیست:", fruits)اگر اندیس مشخص نشود، آخرین عنصر حذف میشود:
last_item = fruits.pop()حذف با دستور del
numbers = [10, 20, 30, 40]
del numbers[1]
print(numbers)خروجی:
[10, 30, 40]میتوان یک برش را نیز حذف کرد:
numbers = [10, 20, 30, 40, 50]
del numbers[1:4]
print(numbers)خالیکردن لیست با clear
tasks = ["مطالعه", "ورزش", "خرید"]
tasks.clear()
print(tasks)خروجی:
[]متغیر همچنان وجود دارد، اما لیست آن خالی شده است.
بررسی وجود عنصر با in و not in
fruits = ["سیب", "موز", "پرتقال"]
print("موز" in fruits)
print("هلو" not in fruits)خروجی:
True
Trueاین عملگرها در شرطها بسیار کاربردی هستند:
product = input("نام محصول: ").strip()
products = ["کتاب", "دفتر", "مداد"]
if product in products:
print("محصول موجود است.")
else:
print("محصول پیدا نشد.")شمارش تکرار یک مقدار با count
scores = [18, 20, 18, 15, 18]
print(scores.count(18))خروجی:
3پیداکردن اندیس با index
fruits = ["سیب", "موز", "پرتقال"]
position = fruits.index("موز")
print(position)خروجی:
1اگر مقدار وجود نداشته باشد، index() خطای ValueError ایجاد میکند. پیش از استفاده میتوان با in بررسی کرد.
مرتبسازی با sort
متد sort() همان لیست را تغییر میدهد:
numbers = [40, 10, 30, 20]
numbers.sort()
print(numbers)خروجی:
[10, 20, 30, 40]مرتبسازی نزولی
numbers.sort(reverse=True)
print(numbers)[40, 30, 20, 10]مرتبسازی رشتهها
names = ["Sara", "Ali", "Reza"]
names.sort()
print(names)مرتبسازی متن براساس قواعد مقایسه نویسهها انجام میشود و ممکن است به حروف کوچک و بزرگ حساس باشد.
مرتبسازی بدون تغییر لیست اصلی با sorted
numbers = [40, 10, 30, 20]
sorted_numbers = sorted(numbers)
print("اصلی:", numbers)
print("مرتبشده:", sorted_numbers)تابع sorted() یک لیست جدید برمیگرداند و لیست اصلی را تغییر نمیدهد.
معکوسکردن ترتیب با reverse
numbers = [1, 2, 3, 4]
numbers.reverse()
print(numbers)خروجی:
[4, 3, 2, 1]reverse() فقط ترتیب فعلی را برعکس میکند و عمل مرتبسازی انجام نمیدهد.
پیمایش لیست با حلقه for
products = ["کتاب", "دفتر", "مداد"]
for product in products:
print(product)در هر دور، متغیر product یکی از عناصر لیست را دریافت میکند.
پیمایش همراه شماره با enumerate
products = ["کتاب", "دفتر", "مداد"]
for number, product in enumerate(products, start=1):
print(number, product)خروجی:
1 کتاب
2 دفتر
3 مدادپیمایش با اندیس
products = ["کتاب", "دفتر", "مداد"]
for index in range(len(products)):
print(index, products[index])وقتی فقط مقدارها را نیاز داریم، پیمایش مستقیم سادهتر است. هنگامی که اندیس لازم است، معمولاً enumerate() خواناتر خواهد بود.
محاسبات روی لیست عددی
برای لیستهای عددی میتوان از توابع داخلی استفاده کرد:
scores = [18, 15, 20, 17]
print("تعداد:", len(scores))
print("مجموع:", sum(scores))
print("کمترین:", min(scores))
print("بیشترین:", max(scores))
print("میانگین:", sum(scores) / len(scores))پیش از محاسبه میانگین باید مطمئن شوید لیست خالی نیست؛ زیرا تقسیم بر صفر خطا ایجاد میکند:
if scores:
average = sum(scores) / len(scores)کپیکردن لیست
انتساب مستقیم دو متغیر به یک لیست، کپی مستقل ایجاد نمیکند:
original = [1, 2, 3]
copy_list = original
copy_list.append(4)
print(original)
print(copy_list)خروجی هر دو لیست شامل عدد ۴ خواهد بود؛ زیرا هر دو متغیر به یک شیء اشاره میکنند.
ساخت کپی مستقل با copy
original = [1, 2, 3]
copy_list = original.copy()
copy_list.append(4)
print(original)
print(copy_list)خروجی:
[1, 2, 3]
[1, 2, 3, 4]روشهای original[:] و list(original) نیز برای کپی سطحی قابل استفاده هستند.
لیستهای تو در تو
یک لیست میتواند لیستهای دیگری را نگهداری کند:
students = [
["علی", 18],
["سارا", 20],
["رضا", 16]
]
print(students[0])
print(students[0][0])
print(students[0][1])خروجی:
['علی', 18]
علی
18اندیس اول لیست داخلی و اندیس دوم عنصر داخل آن را انتخاب میکند.
پیمایش لیست تو در تو
for student in students:
name = student[0]
score = student[1]
print(name, score)تبدیل رشته به لیست با split
text = "سیب,موز,پرتقال"
fruits = text.split(",")
print(fruits)خروجی:
['سیب', 'موز', 'پرتقال']این روش برای دریافت چند مقدار از کاربر نیز مفید است:
items_text = input("محصولات را با ویرگول جدا کنید: ")
items = items_text.split(",")
for item in items:
print(item.strip())تبدیل داده قابل پیمایش به لیست با list
letters = list("Python")
print(letters)خروجی:
['P', 'y', 't', 'h', 'o', 'n']numbers = list(range(1, 6))
print(numbers)[1, 2, 3, 4, 5]معرفی کوتاه List Comprehension
پایتون روشی فشرده برای ساخت لیست از یک حلقه دارد که list comprehension نامیده میشود:
squares = [number ** 2 for number in range(1, 6)]
print(squares)خروجی:
[1, 4, 9, 16, 25]نسخه معمولی همین کد:
squares = []
for number in range(1, 6):
squares.append(number ** 2)برای شروع، روشی را انتخاب کنید که خوانایی بیشتری دارد.
اشتباه رایج: ذخیره نتیجه append در متغیر
متد append() خود لیست را تغییر میدهد و مقدار قابلاستفادهای برنمیگرداند:
numbers = [1, 2]
result = numbers.append(3)
print(result)خروجی:
Noneنسخه درست:
numbers = [1, 2]
numbers.append(3)
print(numbers)همین نکته درباره متدهایی مانند sort()، reverse() و clear() نیز صدق میکند.
اشتباه رایج: extend با یک رشته
items = ["کتاب"]
items.extend("مداد")
print(items)از آنجا که رشته قابل پیمایش است، حروف آن جداگانه اضافه میشوند. برای افزودن کل رشته بهعنوان یک عنصر، از append() استفاده کنید:
items.append("مداد")اشتباه رایج: تغییر لیست هنگام پیمایش
حذف عناصر از همان لیستی که در حال پیمایش آن هستیم میتواند باعث نادیدهگرفتن بعضی عناصر شود:
numbers = [1, 2, 3, 4, 5, 6]
for number in numbers:
if number % 2 == 0:
numbers.remove(number)روش امنتر، ساخت لیست جدید است:
numbers = [1, 2, 3, 4, 5, 6]
odd_numbers = []
for number in numbers:
if number % 2 != 0:
odd_numbers.append(number)
print(odd_numbers)پروژه اول: برنامه مدیریت فهرست خرید
در این پروژه، کاربر میتواند محصول اضافه کند، حذف کند، فهرست را ببیند یا از برنامه خارج شود:
shopping_list = []
while True:
print("\n1. افزودن محصول")
print("2. حذف محصول")
print("3. نمایش فهرست")
print("4. خروج")
choice = input("انتخاب شما: ").strip()
if choice == "1":
item = input("نام محصول: ").strip()
if item:
shopping_list.append(item)
print("محصول اضافه شد.")
else:
print("نام محصول نمیتواند خالی باشد.")
elif choice == "2":
item = input("نام محصول برای حذف: ").strip()
if item in shopping_list:
shopping_list.remove(item)
print("محصول حذف شد.")
else:
print("این محصول در فهرست نیست.")
elif choice == "3":
if shopping_list:
print("فهرست خرید:")
for number, item in enumerate(shopping_list, start=1):
print(f"{number}. {item}")
else:
print("فهرست خرید خالی است.")
elif choice == "4":
print("برنامه بسته شد.")
break
else:
print("گزینه نامعتبر است.")این پروژه مفاهیم لیست، append()، remove()، حلقه while، شرط و enumerate() را ترکیب میکند.
پروژه دوم: گزارش نمرات دانشآموز
scores = []
while True:
score_text = input("نمره را وارد کنید یا done بنویسید: ").strip().lower()
if score_text == "done":
break
try:
score = float(score_text)
if 0 <= score <= 20:
scores.append(score)
else:
print("نمره باید بین صفر تا بیست باشد.")
except ValueError:
print("لطفاً عدد معتبر وارد کنید.")
if scores:
print("تعداد نمرهها:", len(scores))
print("میانگین:", sum(scores) / len(scores))
print("بیشترین نمره:", max(scores))
print("کمترین نمره:", min(scores))
else:
print("هیچ نمرهای ثبت نشد.")تمرینهای درس
- لیستی از پنج شهر بسازید و نخستین، آخرین و عنصر وسط را نمایش دهید.
- لیستی از عددهای ۱ تا ۱۰ بسازید و فقط عددهای زوج را داخل یک لیست جدید قرار دهید.
- برنامهای بنویسید که نام یک محصول را دریافت و وجود آن را در فهرست انبار بررسی کند.
- لیستی از نمرهها بسازید و مجموع، میانگین، کمترین و بیشترین مقدار را نمایش دهید.
- برنامهای بنویسید که سه نام از کاربر دریافت و آنها را بهترتیب الفبایی چاپ کند.
- لیستی دارای مقدارهای تکراری بسازید و تعداد تکرار یک مقدار را با
count()نمایش دهید. - برنامهای بنویسید که یک لیست را بدون تغییر نسخه اصلی، بهصورت نزولی مرتب کند.
- یک فهرست کارهای روزانه بسازید که قابلیت افزودن، حذف و نمایش کارها را داشته باشد.
- لیستی از عددها دریافت کنید و عددهای کمتر از صفر را از نتیجه نهایی حذف کنید.
📌 همچنین بخوانید: بازار کار پایتون در ایران، نصب و تنظیم پایتون در VS Code و برنامهنویسی پایتون با گوشی
پرسشهای متداول
آیا لیست میتواند مقدار تکراری داشته باشد؟
بله. لیستها مقدارهای تکراری را حفظ میکنند و هر رخداد یک عنصر مستقل محسوب میشود.
اندیس نخستین عنصر لیست چند است؟
اندیس نخستین عنصر صفر است. آخرین عنصر را نیز میتوان با اندیس -1 دریافت کرد.
تفاوت append و extend چیست؟
append() یک مقدار را بهعنوان یک عنصر به انتهای لیست اضافه میکند؛ اما extend() عناصر یک داده قابل پیمایش را جداگانه وارد لیست میکند.
تفاوت remove و pop چیست؟
remove() براساس مقدار حذف میکند. pop() براساس اندیس حذف میکند و مقدار حذفشده را نیز برمیگرداند.
چرا نتیجه sort برابر None است؟
زیرا sort() همان لیست را تغییر میدهد و لیست جدیدی برنمیگرداند. برای دریافت نسخه مرتبشده جدید از sorted() استفاده کنید.
آیا لیست قابل تغییر است؟
بله. لیست از ساختارهای قابل تغییر پایتون است و میتوان عناصر آن را پس از ساخت تغییر داد.
چگونه یک لیست را کپی کنیم؟
برای کپی مستقل سطحی میتوان از copy()، برش [:] یا تابع list() استفاده کرد.
جمعبندی درس
در این درس یاد گرفتید لیستها چگونه چند مقدار را در یک ساختار مرتب و قابل تغییر نگهداری میکنند. با ساخت لیست، اندیسگذاری، برش، افزودن و حذف عناصر، مرتبسازی، پیمایش، کپیکردن و لیستهای تو در تو آشنا شدید. همچنین با دو پروژه عملی، کاربرد لیست در برنامههای واقعی را تمرین کردید.
ادامه مسیر یادگیری پایتون
برای یادگیری منظم، آموزشهای مرتبط زیر را بهترتیب دنبال کنید:
برای ذخیره پیشرفت در همه دستگاهها و دریافت گواهی پایان مسیر، رایگان ثبتنام کن یا وارد شو.