FA-TOOLS — Header Component

آموزش لیست در پایتون با مثال‌های کاربردی و کد آماده

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

🚀 خلاصه آموزش لیست در پایتون در یک نگاه

آموزش لیست در پایتون با مثال‌های کاربردی و کد آماده — تصویر 1
  • 💡 چیست؟ مجموعه‌ای مرتب و قابل تغییر از آیتم‌ها، هر نوع داده‌ای رو می‌تونه تو خودش جا بده.
  • 🛠️ قابلیت‌ها: اضافه کردن، حذف کردن، تغییر آیتم‌ها، برش دادن (Slicing) و مرتب‌سازی.
  • ✨ مثال کلیدی: my_list = [1, 'hello', 3.14]
  • 🚀 تکنیک پیشرفته: List Comprehension برای ساخت لیست‌های سریع و خوانا.
  • ⚠️ نکات: مواظب کپی‌های سطحی باش! همیشه از list.copy() یا copy.deepcopy() استفاده کن.

👇 در ادامه با جزئیات کامل و مثال‌های عملی همراهتیم!

لیست در پایتون چیست؟

آموزش لیست در پایتون با مثال‌های کاربردی و کد آماده — تصویر 3

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

  • مرتب (Ordered): ترتیب وارد کردن آیتم‌ها حفظ میشه و می‌تونی با استفاده از ایندکس (Index) بهشون دسترسی پیدا کنی.
  • قابل تغییر (Mutable): بعد از اینکه لیست رو ساختی، می‌تونی آیتم‌ها رو تغییر بدی، حذف کنی یا آیتم جدید اضافه کنی.
  • اجازه تکرار (Allows Duplicates): می‌تونی چند بار یک آیتم رو داخل لیستت داشته باشی.
  • چند نوع داده (Heterogeneous): آیتم‌ها لازم نیست همه از یک نوع باشن. مثلاً می‌تونی عدد، رشته، و حتی لیست دیگه رو تو یک لیست داشته باشی.

لیست‌ها رو با براکت [] تعریف می‌کنیم و آیتم‌ها رو با کاما از هم جدا می‌کنیم. بیا یه نگاهی به مثال زیر بندازیم:


# یک لیست از اعداد صحیح
numbers = [1, 2, 3, 4, 5]
print(f"لیست اعداد: {numbers}")

# یک لیست از رشته‌ها (اسم میوه‌ها)
fruits = ["apple", "banana", "cherry"]
print(f"لیست میوه‌ها: {fruits}")

# یک لیست با انواع داده مختلف
mixed_list = [10, "hello", 3.14, True]
print(f"لیست ترکیبی: {mixed_list}")

# لیست تکراری
duplicate_list = [1, 2, 2, 3, 1]
print(f"لیست با آیتم‌های تکراری: {duplicate_list}")

چرا باید از لیست‌ها استفاده کنیم؟

خب، چرا انقدر لیست‌ها مهم هستن؟ دلایل زیادی هستن که لیست‌ها رو به یکی از ضروری‌ترین ابزارهای برنامه‌نویسی تبدیل می‌کنن:

  • انعطاف‌پذیری بالا: به خاطر قابل تغییر بودن، می‌تونی لیست‌ها رو مطابق نیازت تغییر بدی.
  • مدیریت مجموعه‌ای از داده‌ها: به جای تعریف ده‌ها متغیر جداگانه، می‌تونی همه رو تو یک لیست جمع کنی و راحت‌تر مدیریت کنی.
  • پایه‌گذاری برای الگوریتم‌ها: بسیاری از الگوریتم‌های مرتب‌سازی، جستجو و پردازش داده روی لیست‌ها کار می‌کنن.
  • استفاده در فریم‌ورک‌ها و کتابخانه‌ها: تقریباً در هر کتابخانه پایتون، از NumPy گرفته تا Django، با لیست‌ها سروکار خواهی داشت.

ایجاد لیست‌ها

ایجاد لیست تو پایتون خیلی راحته. چند روش اصلی برای این کار داریم:

  • لیست خالی: برای شروع، می‌تونی یک لیست خالی بسازی.
  • لیست با عناصر اولیه: رایج‌ترین روش، همون موقع تعریف، عناصر رو داخل براکت بذاری.
  • با استفاده از list() constructor: اگه یک iterable دیگه (مثل تاپل یا رشته) داری، می‌تونی اونو به لیست تبدیل کنی.

# لیست خالی
empty_list = []
print(f"لیست خالی: {empty_list}")

# لیست با عناصر اولیه
my_items = ["Laptop", "Mouse", "Keyboard"]
print(f"لیست با عناصر: {my_items}")

# ساخت لیست از یک رشته (هر کاراکتر یک عنصر)
name_list = list("Python")
print(f"لیست از رشته: {name_list}")

# ساخت لیست از یک تاپل
my_tuple = (10, 20, 30)
list_from_tuple = list(my_tuple)
print(f"لیست از تاپل: {list_from_tuple}")

دسترسی به عناصر لیست

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

  • ایندکس مثبت: از چپ به راست و از صفر شروع میشه.
  • ایندکس منفی: از راست به چپ و از -1 شروع میشه (-1 آخرین عنصر، -2 یکی مانده به آخر و …).
  • اسلایسینگ (Slicing): برای دسترسی به بخشی از لیست.

my_list = ['A', 'B', 'C', 'D', 'E']

# دسترسی با ایندکس مثبت
print(f"عنصر اول (ایندکس 0): {my_list[0]}")
print(f"عنصر سوم (ایندکس 2): {my_list[2]}")

# دسترسی با ایندکس منفی
print(f"عنصر آخر (ایندکس -1): {my_list[-1]}")
print(f"عنصر یکی مانده به آخر (ایندکس -2): {my_list[-2]}")

# اسلایسینگ: [شروع:پایان:گام]
# از ایندکس 1 تا قبل از ایندکس 4 (یعنی 1، 2، 3)
print(f"برش [1:4]: {my_list[1:4]}")

# از ابتدا تا قبل از ایندکس 3
print(f"برش [:3]: {my_list[:3]}")

# از ایندکس 2 تا انتها
print(f"برش [2:]: {my_list[2:]}")

# کپی کامل لیست (با اسلایسینگ)
print(f"کپی کامل: {my_list[:]}")

# اسلایسینگ با گام (هر دوتا یکی)
print(f"برش با گام [::2]: {my_list[::2]}")

# برعکس کردن لیست با اسلایسینگ
print(f"برعکس شده: {my_list[::-1]}")

نکته مهم: اگه سعی کنی به ایندکسی دسترسی پیدا کنی که وجود نداره (مثلاً my_list[10] برای لیستی با 5 عنصر)، پایتون بهت خطای IndexError میده.

تغییر و ویرایش لیست‌ها

قابلیت تغییر (mutability) لیست‌ها بهمون این اجازه رو میده که عناصرشون رو بعد از ایجاد، دستکاری کنیم.

تغییر یک عنصر

برای تغییر یک عنصر، کافیه به ایندکس اون اشاره کنی و مقدار جدید رو بهش اختصاص بدی.


fruits = ["apple", "banana", "cherry"]
print(f"لیست اولیه: {fruits}")

fruits[1] = "orange" # banana رو به orange تغییر میدیم
print(f"بعد از تغییر: {fruits}")

اضافه کردن عناصر

  • append(item): یک عنصر رو به انتهای لیست اضافه می‌کنه.
  • insert(index, item): یک عنصر رو در یک ایندکس مشخص اضافه می‌کنه.
  • extend(iterable): عناصر یک iterable (مثل لیست دیگه) رو به انتهای لیست فعلی اضافه می‌کنه.

my_numbers = [1, 2, 3]

my_numbers.append(4)
print(f"بعد از append(4): {my_numbers}") # [1, 2, 3, 4]

my_numbers.insert(1, 1.5)
print(f"بعد از insert(1, 1.5): {my_numbers}") # [1, 1.5, 2, 3, 4]

another_list = [5, 6]
my_numbers.extend(another_list)
print(f"بعد از extend([5, 6]): {my_numbers}") # [1, 1.5, 2, 3, 4, 5, 6]

حذف عناصر

  • remove(item): اولین رخداد یک عنصر مشخص رو حذف می‌کنه.
  • pop(index): عنصری رو در یک ایندکس مشخص حذف می‌کنه و اون عنصر رو برمی‌گردونه. اگه ایندکس ندی، آخرین عنصر رو حذف می‌کنه.
  • del statement: با استفاده از ایندکس یا اسلایس، عناصر رو حذف می‌کنه.
  • clear(): همه عناصر لیست رو حذف می‌کنه و لیست رو خالی می‌کنه.

my_items = ["apple", "banana", "cherry", "apple"]

my_items.remove("apple")
print(f"بعد از remove('apple'): {my_items}") # ['banana', 'cherry', 'apple']

popped_item = my_items.pop(1) # حذف 'cherry' در ایندکس 1
print(f"بعد از pop(1): {my_items}, آیتم حذف شده: {popped_item}") # ['banana', 'apple'], آیتم حذف شده: cherry

last_item = my_items.pop() # حذف آخرین عنصر
print(f"بعد از pop(): {my_items}, آخرین آیتم حذف شده: {last_item}") # ['banana'], آخرین آیتم حذف شده: apple

another_list = [10, 20, 30, 40, 50]
del another_list[0]
print(f"بعد از del another_list[0]: {another_list}") # [20, 30, 40, 50]

del another_list[1:3] # حذف عناصر از ایندکس 1 تا قبل از 3 (یعنی 30, 40)
print(f"بعد از del another_list[1:3]: {another_list}") # [20, 50]

another_list.clear()
print(f"بعد از clear(): {another_list}") # []

⚠️ هشدار: اگه remove() رو با آیتمی صدا بزنی که تو لیست نیست، خطای ValueError می‌گیری.

عملیات متداول روی لیست‌ها

پایتون یه سری توابع داخلی خفن برای کار با لیست‌ها داره که حسابی کارتو راحت می‌کنه.

  • طول لیست len(): تعداد عناصر لیست رو برمی‌گردونه.
  • ترکیب لیست‌ها (Concatenation): با عملگر + دو لیست رو به هم اضافه می‌کنی.
  • تکرار لیست (Repetition): با عملگر * لیست رو چند بار تکرار می‌کنی.
  • بررسی وجود (in Keyword): چک می‌کنی که یک آیتم تو لیست هست یا نه.
  • پیمایش (Iteration) با حلقه for: برای دسترسی به تک تک عناصر لیست.
  • مرتب‌سازی (Sorting): برای مرتب کردن عناصر لیست.
  • برعکس کردن (Reversing): برای برعکس کردن ترتیب عناصر.
  • کپی کردن لیست: برای ساخت یک کپی مستقل از لیست.

my_list = [10, 20, 30, 40, 50]
list_b = [60, 70]

# len()
print(f"طول لیست: {len(my_list)}") # 5

# Concatenation
combined_list = my_list + list_b
print(f"لیست ترکیب شده: {combined_list}") # [10, 20, 30, 40, 50, 60, 70]

# Repetition
repeated_list = [0] * 3
print(f"لیست تکرار شده: {repeated_list}") # [0, 0, 0]

# in keyword
print(f"آیا 30 در لیست است؟ {'30' in my_list}") # False (دقت کنید: '30' یک رشته است نه عدد 30)
print(f"آیا 30 در لیست است؟ {30 in my_list}") # True

# Iteration
print("عناصر لیست:")
for item in my_list:
    print(item)

# Sorting - متد sort() لیست اصلی رو تغییر میده
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.sort()
print(f"لیست مرتب شده (sort()): {numbers}") # [1, 1, 2, 3, 4, 5, 9]

# Sorting - تابع sorted() یک لیست جدید برمی‌گردونه و لیست اصلی رو تغییر نمیده
unsorted_numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_new_list = sorted(unsorted_numbers)
print(f"لیست اصلی (بعد از sorted()): {unsorted_numbers}") # [3, 1, 4, 1, 5, 9, 2]
print(f"لیست جدید مرتب شده (sorted()): {sorted_new_list}") # [1, 1, 2, 3, 4, 5, 9]

# Reversing - متد reverse() لیست اصلی رو تغییر میده
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(f"لیست برعکس شده (reverse()): {numbers}") # [5, 4, 3, 2, 1]

# Reversing - تابع reversed() یک iterator برمی‌گردونه که باید به لیست تبدیلش کنی
original_list = [1, 2, 3, 4, 5]
reversed_new_list = list(reversed(original_list))
print(f"لیست اصلی (بعد از reversed()): {original_list}") # [1, 2, 3, 4, 5]
print(f"لیست جدید برعکس شده (reversed()): {reversed_new_list}") # [5, 4, 3, 2, 1]

درک تفاوت بین copy() و = (کپی سطحی و عمیق)

یکی از مهم‌ترین نکاتی که باید در مورد لیست‌ها بدونی، تفاوت بین انتساب (=) و کپی کردن (.copy() یا copy.deepcopy()) هست. این مسئله می‌تونه باعث باگ‌های عجیب و غریب تو برنامه‌هات بشه.

  • انتساب (=): وقتی یک لیست رو به یک متغیر دیگه انتساب میدی، در واقع دو متغیر به یک لیست در حافظه اشاره می‌کنن. یعنی تغییر در یکی، روی اون یکی هم تاثیر میذاره.
  • کپی سطحی (Shallow Copy) با .copy() یا اسلایسینگ [:]: یک کپی جدید از لیست ایجاد می‌کنه، اما اگه لیستت حاوی آبجکت‌های قابل تغییر دیگه (مثل لیست‌های تو در تو) باشه، این آبجکت‌ها همچنان در هر دو لیست به یک مکان حافظه اشاره می‌کنن.
  • کپی عمیق (Deep Copy) با copy.deepcopy(): یک کپی کاملاً مستقل از لیست و همه عناصر تو در توش ایجاد می‌کنه. برای این کار باید ماژول copy رو ایمپورت کنی.

import copy

original_list = [1, 2, [3, 4]]

# 1. انتساب (=)
assigned_list = original_list
assigned_list[0] = 100
print(f"Original بعد از انتساب: {original_list}") # [100, 2, [3, 4]]
print(f"Assigned بعد از انتساب: {assigned_list}") # [100, 2, [3, 4]]
# هر دو تغییر کردن چون به یک لیست اشاره می‌کنن!

# 2. کپی سطحی (با .copy() یا [:])
# برای مثال، فرض می‌کنیم original_list به حالت اولیه برگشته (برای درک بهتر)
original_list = [1, 2, [3, 4]]
shallow_copied_list = original_list.copy() # یا original_list[:]
shallow_copied_list[0] = 200 # تغییر عنصر غیر لیست
print(f"Original بعد از کپی سطحی (عنصر غیر لیست): {original_list}") # [1, 2, [3, 4]]
print(f"Shallow Copy بعد از کپی سطحی (عنصر غیر لیست): {shallow_copied_list}") # [200, 2, [3, 4]]
# تا اینجا اوکیه، لیست اصلی تغییر نکرده.

shallow_copied_list[2][0] = 300 # تغییر عنصر لیست تو در تو
print(f"Original بعد از کپی سطحی (عنصر تو در تو): {original_list}") # [1, 2, [300, 4]] <-- اوه!
print(f"Shallow Copy بعد از کپی سطحی (عنصر تو در تو): {shallow_copied_list}") # [200, 2, [300, 4]]
# اینجا هر دو تغییر کردن چون لیست تو در تو همچنان به یک آدرس در حافظه اشاره می‌کنه!

# 3. کپی عمیق (با copy.deepcopy())
original_list = [1, 2, [3, 4]]
deep_copied_list = copy.deepcopy(original_list)
deep_copied_list[0] = 400
deep_copied_list[2][0] = 500
print(f"Original بعد از کپی عمیق: {original_list}") # [1, 2, [3, 4]]
print(f"Deep Copy بعد از کپی عمیق: {deep_copied_list}") # [400, 2, [500, 4]]
# حالا دیگه هیچ کدوم از تغییرات در deep_copied_list روی original_list تاثیر نذاشتن!

خلاصه: اگه لیستی با عناصر ساده داری، .copy() خوبه. ولی اگه لیستت تو در تو هست و نمی‌خوای تغییرات روی کپی، روی لیست اصلی تاثیر بذاره، حتماً از copy.deepcopy() استفاده کن.

متدهای کاربردی لیست

علاوه بر متدهایی که برای اضافه و حذف کردن گفتیم، چند متد دیگه هم هستن که خیلی به دردت می‌خورن:

  • count(item): تعداد دفعاتی که یک آیتم تو لیست تکرار شده رو برمی‌گردونه.
  • index(item, start, end): ایندکس اولین رخداد یک آیتم رو برمی‌گردونه. می‌تونی محدوده جستجو رو هم مشخص کنی. اگه آیتم پیدا نشه، ValueError میده.

my_numbers = [1, 2, 3, 2, 4, 2]

print(f"تعداد 2 در لیست: {my_numbers.count(2)}") # 3
print(f"تعداد 5 در لیست: {my_numbers.count(5)}") # 0

print(f"ایندکس اولین 2: {my_numbers.index(2)}") # 1
print(f"ایندکس اولین 2 بعد از ایندکس 2: {my_numbers.index(2, 2)}") # 3

# برای جلوگیری از خطا، قبل از استفاده از index می‌تونی چک کنی که آیتم وجود داره:
if 5 in my_numbers:
    print(f"ایندکس 5: {my_numbers.index(5)}")
else:
    print("5 در لیست وجود ندارد.")

لیست‌های تو در تو (Nested Lists)

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


# لیست تو در تو برای نگهداری نمرات
grades = [
    ["علی", 18, 19],
    ["زهرا", 17, 20],
    ["رضا", 15, 16]
]

# دسترسی به عنصر
# نمره اول زهرا (زهرا در ایندکس 1، نمره اول در لیست داخلی در ایندکس 1)
print(f"نمره اول زهرا: {grades[1][1]}") # 17

# تغییر عنصر
grades[0][2] = 20 # نمره دوم علی رو تغییر میدیم
print(f"نمرات علی بعد از تغییر: {grades[0]}") # ['علی', 18, 20]

# پیمایش لیست‌های تو در تو
print("نمرات همه دانشجوها:")
for student_grades in grades:
    print(f"نام: {student_grades[0]}, نمرات: {student_grades[1:]}")

لیست کمپریهنشن (List Comprehensions): یک ابزار قدرتمند

لیست کمپریهنشن (List Comprehension) یکی از ویژگی‌های باحال و منحصر به فرد پایتون هست که بهت اجازه میده لیست‌ها رو به شکل خیلی فشرده و خوانا ایجاد کنی. به جای اینکه برای ساخت یک لیست جدید با عملیات روی لیست دیگه، کلی خط کد بنویسی، می‌تونی همه‌اش رو تو یک خط جمع کنی.


# مثال 1: ساخت لیستی از مربع اعداد 1 تا 5
squares = []
for i in range(1, 6):
    squares.append(i**2)
print(f"روش سنتی (مربع اعداد): {squares}") # [1, 4, 9, 16, 25]

# همون کار با List Comprehension:
squares_comprehension = [i**2 for i in range(1, 6)]
print(f"با List Comprehension (مربع اعداد): {squares_comprehension}") # [1, 4, 9, 16, 25]

# مثال 2: فیلتر کردن اعداد زوج از یک لیست
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [num for num in numbers if num % 2 == 0]
print(f"اعداد زوج: {even_numbers}") # [2, 4, 6, 8, 10]

# مثال 3: ترکیب Map و Filter با List Comprehension
# ساخت لیستی از مربع اعداد زوج
even_squares = [num**2 for num in numbers if num % 2 == 0]
print(f"مربع اعداد زوج: {even_squares}") # [4, 16, 36, 64, 100]

# مثال 4: List Comprehension با if-else (شرط برای مقدار خروجی)
status = ["Even" if num % 2 == 0 else "Odd" for num in range(1, 6)]
print(f"وضعیت زوج/فرد: {status}") # ['Odd', 'Even', 'Odd', 'Even', 'Odd']

چرا List Comprehension خوبه؟ هم کد کوتاه‌تر و خواناتری داری، هم معمولاً از حلقه‌های معمولی for سریع‌تر عمل می‌کنه.

نکات پیشرفته و بهترین شیوه‌ها

برای اینکه کد پایتون بهتری بنویسی، یه سری نکات رو در مورد لیست‌ها در نظر بگیر:

  1. لیست‌ها رو بهینه پیمایش کن:
    برای پیمایش لیست و دسترسی به ایندکس، از enumerate() استفاده کن. اینطوری هم به عنصر و هم به ایندکسش دسترسی داری.

    
    my_items = ["آب", "برنج", "نان"]
    for index, item in enumerate(my_items):
        print(f"{index}: {item}")
    
    
  2. استفاده از join() برای رشته‌ها:
    اگه لیستی از رشته‌ها داری و می‌خوای اونا رو به یک رشته واحد تبدیل کنی، از str.join(list) استفاده کن که خیلی بهینه‌تر از اضافه کردن مکرر رشته‌ها با + هست.

    
    words = ["Hello", "World", "Python"]
    sentence = " ".join(words)
    print(sentence) # Hello World Python
    
    
  3. زمان استفاده از ساختارهای داده دیگر:
    همیشه لیست بهترین گزینه نیست.

    • اگه ترتیب برات مهمه ولی نمی‌خوای عناصر تغییر کنن، از تاپل‌ها (Tuples) استفاده کن.
    • اگه سرعت جستجو و منحصر به فرد بودن عناصر مهمه و ترتیب مهم نیست، از ست‌ها (Sets) استفاده کن.
    • اگه می‌خوای داده‌ها رو به صورت جفت‌های کلید-مقدار نگهداری کنی، از دیکشنری‌ها (Dictionaries) بهره ببر.
  4. پرهیز از تغییر لیست در حین پیمایش:
    اگه داری روی یک لیست حلقه می‌زنی و همزمان می‌خوای عناصرش رو حذف یا اضافه کنی، این کار می‌تونه به نتایج غیرمنتظره و باگ منجر بشه. همیشه بهتره روی یک کپی از لیست پیمایش کنی یا از تکنیک‌هایی مثل List Comprehension برای ساخت لیست جدید استفاده کنی.

عیب‌یابی سریع: مشکلات رایج لیست‌ها و راه‌حل آن‌ها

مثل هر ابزار دیگه‌ای، لیست‌ها هم ممکنه گاهی اوقات باعث دردسر بشن. اینجا چند تا از مشکلات رایج و راه‌حلشون رو آوردیم تا کمتر اذیت بشی:

مشکل رایج راه‌حل
IndexError: list index out of range (دسترسی به ایندکس ناموجود)

همیشه قبل از دسترسی به یک ایندکس، از وجود اون مطمئن شو. از len(my_list) برای بررسی طول لیست استفاده کن، یا از بلوک try-except برای مدیریت خطا.


my_list = [1, 2]
try:
    print(my_list[5])
except IndexError:
    print("ایندکس خارج از محدوده است!")

ValueError: ‘item’ not in list (حذف یا جستجوی آیتم ناموجود)

قبل از استفاده از .remove() یا .index()، با عملگر in وجود آیتم رو بررسی کن.


my_fruits = ["apple", "banana"]
if "cherry" in my_fruits:
    my_fruits.remove("cherry")
else:
    print("Cherry در لیست نیست.")

تغییر ناخواسته لیست اصلی بعد از کپی (مشکل کپی سطحی)

اگه لیستت شامل آبجکت‌های قابل تغییر (مثل لیست‌های دیگه) هست و نمی‌خوای کپی و اصلی به هم ربط داشته باشن، از import copy; copy.deepcopy(my_list) استفاده کن.


import copy
original = [1, [2, 3]]
deep_copy = copy.deepcopy(original)
deep_copy[1][0] = 99
print(original) # [1, [2, 3]] - اصلی تغییر نکرد

حلقه زدن روی لیست و همزمان تغییر دادن آن (باعث Skip شدن عناصر یا خطای IndexError)

هرگز لیستی رو که داری روی اون حلقه می‌زنی، همزمان تغییر نده. به جای این کار، روی یک کپی از لیست حلقه بزن (for item in my_list[:]) یا لیست جدیدی بساز.


# روش صحیح برای حذف در حین پیمایش
numbers = [1, 2, 3, 4, 5, 6]
new_numbers = [n for n in numbers if n % 2 != 0] # حذف اعداد زوج
print(new_numbers) # [1, 3, 5]

پرسش‌های متداول

آیا لیست‌ها در پایتون مرتب هستند؟

بله، لیست‌ها از نوع داده‌های مرتب در پایتون هستند. این یعنی ترتیبی که عناصر را اضافه می‌کنید حفظ می‌شود و می‌توانید با استفاده از ایندکس (مثلاً my_list[0]) به عناصر دسترسی پیدا کنید.

تفاوت اصلی لیست و تاپل در پایتون چیست؟

تفاوت اصلی در قابلیت تغییر (mutability) آن‌هاست. لیست‌ها ([]) قابل تغییر هستند، یعنی پس از ایجاد می‌توانید عناصر آن‌ها را اضافه، حذف یا ویرایش کنید. اما تاپل‌ها (()) غیرقابل تغییر (immutable) هستند و پس از ایجاد، نمی‌توانید عناصرشان را تغییر دهید.

چگونه یک عنصر را از لیست حذف کنم؟

برای حذف عناصر از لیست چندین روش وجود دارد:

  • remove(value): اولین رخداد یک مقدار مشخص را حذف می‌کند.
  • pop(index): عنصر را در یک ایندکس مشخص حذف کرده و آن را برمی‌گرداند. اگر ایندکسی داده نشود، آخرین عنصر را حذف می‌کند.
  • del list[index]: عنصر را در ایندکس مشخص حذف می‌کند.
  • clear(): همه عناصر لیست را حذف کرده و آن را خالی می‌کند.

List Comprehension چیست و چه فایده‌ای دارد؟

List Comprehension یک روش کوتاه و خوانا برای ایجاد لیست‌های جدید بر اساس لیست‌های موجود یا هر iterable دیگری است. با استفاده از آن می‌توانید در یک خط کد، عملیات فیلتر کردن، تبدیل و تولید لیست را انجام دهید که هم کد را فشرده‌تر و خواناتر می‌کند و هم معمولاً از حلقه‌های سنتی for کارآمدتر است.

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

شاد و پیروز باشی!

Table of Contents

آخرین نوشته‌ها