آموزش پایتون, پایتون مقدماتی

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

لیست‌ها در پایتون

🗓 آخرین به‌روزرسانی:

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

این مطلب، درس یازدهم از دوره رایگان آموزش پایتون از صفر است. در درس قبلی با حلقه 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("هیچ نمره‌ای ثبت نشد.")

تمرین‌های درس

  1. لیستی از پنج شهر بسازید و نخستین، آخرین و عنصر وسط را نمایش دهید.
  2. لیستی از عددهای ۱ تا ۱۰ بسازید و فقط عددهای زوج را داخل یک لیست جدید قرار دهید.
  3. برنامه‌ای بنویسید که نام یک محصول را دریافت و وجود آن را در فهرست انبار بررسی کند.
  4. لیستی از نمره‌ها بسازید و مجموع، میانگین، کمترین و بیشترین مقدار را نمایش دهید.
  5. برنامه‌ای بنویسید که سه نام از کاربر دریافت و آن‌ها را به‌ترتیب الفبایی چاپ کند.
  6. لیستی دارای مقدارهای تکراری بسازید و تعداد تکرار یک مقدار را با count() نمایش دهید.
  7. برنامه‌ای بنویسید که یک لیست را بدون تغییر نسخه اصلی، به‌صورت نزولی مرتب کند.
  8. یک فهرست کارهای روزانه بسازید که قابلیت افزودن، حذف و نمایش کارها را داشته باشد.
  9. لیستی از عددها دریافت کنید و عددهای کمتر از صفر را از نتیجه نهایی حذف کنید.

📌 همچنین بخوانید: بازار کار پایتون در ایران، نصب و تنظیم پایتون در VS Code و برنامه‌نویسی پایتون با گوشی

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

آیا لیست می‌تواند مقدار تکراری داشته باشد؟

بله. لیست‌ها مقدارهای تکراری را حفظ می‌کنند و هر رخداد یک عنصر مستقل محسوب می‌شود.

اندیس نخستین عنصر لیست چند است؟

اندیس نخستین عنصر صفر است. آخرین عنصر را نیز می‌توان با اندیس -1 دریافت کرد.

تفاوت append و extend چیست؟

append() یک مقدار را به‌عنوان یک عنصر به انتهای لیست اضافه می‌کند؛ اما extend() عناصر یک داده قابل پیمایش را جداگانه وارد لیست می‌کند.

تفاوت remove و pop چیست؟

remove() براساس مقدار حذف می‌کند. pop() براساس اندیس حذف می‌کند و مقدار حذف‌شده را نیز برمی‌گرداند.

چرا نتیجه sort برابر None است؟

زیرا sort() همان لیست را تغییر می‌دهد و لیست جدیدی برنمی‌گرداند. برای دریافت نسخه مرتب‌شده جدید از sorted() استفاده کنید.

آیا لیست قابل تغییر است؟

بله. لیست از ساختارهای قابل تغییر پایتون است و می‌توان عناصر آن را پس از ساخت تغییر داد.

چگونه یک لیست را کپی کنیم؟

برای کپی مستقل سطحی می‌توان از copy()، برش [:] یا تابع list() استفاده کرد.

جمع‌بندی درس

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

ادامه مسیر یادگیری پایتون

برای یادگیری منظم، آموزش‌های مرتبط زیر را به‌ترتیب دنبال کنید:

می‌خواهی پیشرفتت ذخیره شود؟با ورود یا ثبت‌نام رایگان، درس‌های تمام‌شده را علامت بزن و درصد پیشرفتت را در حساب کاربری ببین.ورود / ثبت‌نام برای ذخیره پیشرفت
درس بعدی · دوره رایگان پایتون (مقدماتی) (13 از 16)رشته‌ها در پایتون؛ تعریف، ایندکس و برش (Slicing) رشته ←
آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.
🧭 مسیر یادگیری پایتون از صفر
ماژول 4: رشته‌ها و لیست‌ها — درس 17 از 44

برای ذخیره پیشرفت در همه دستگاه‌ها و دریافت گواهی پایان مسیر، رایگان ثبت‌نام کن یا وارد شو.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *