ساختار داده لیست (List) در پایتون
ساختار داده لیست (List) در پایتون
ساختار داده لیست (List) در پایتون
در برنامهنویسی پایتون، برای ذخیره چندین داده در یک متغیر از ساختارهای داده گوناگون استفاده میشود. لیست (List) پرکاربردترین و انعطافپذیرترین ساختار داده ترتیبی در پایتون است.
لیست چیست و چه کاربردهایی دارد؟
لیست یک دنباله مرتب (Ordered)، تغییرپذیر (Mutable) و دارای قابلیت پذیرش دادههای تکراری است.
- مرتب بودن (Ordered): دادهها به ترتیبی که درج میشوند در حافظه باقی میمانند و هر عنصر اندیس مشخصی دارد.
- تغییرپذیری (Mutable): اعضای لیست را میتوان پس از ساخت کم، زیاد یا ویرایش کرد.
- ناهمگن: از هر نوع type داده مختلف را به در خود جا می دهد.
- کاربردها:
- نگهداری دادههای متوالی مثل نمرات، اسامی و ورودیهای کاربر.
- ذخیره خروجی حلقهها در حین اجرای برنامه.
- ساخت ساختارهای دادهای مانند صف (Queue) و پشته (Stack).
نحوه ساخت لیست
لیست با براکت [] یا تابع سازنده list() ساخته میشود و میتواند شامل انواع داده مختلف (عدد، متن، بولین و حتی یک لیست دیگر) باشد:
# لیست خالی
empty_list = []
# لیست همگن عددی
scores = [18, 19.5, 20]
# لیست ناهمگن با انواع مختلف داده
mixed_list = ["Ali", 25, True, 3.14, [10, 20]]
اندیسگذاری (Indexing) و برشدادن (Slicing)
قوانین دسترسی به عناصر لیست دقیقاً مشابه رشتهها است:
- اندیس مثبت: از چپ به راست با شروع از
0 - اندیس منفی: از راست به چپ با شروع از
1- - برشدادن: با الگوی
list[start:stop:step]
letters = ["a", "b", "c", "d", "e"]
first_item = letters[0] # خروجی: 'a'
last_item = letters[-1] # خروجی: 'e'
sub_list = letters[1:4] # خروجی: ['b', 'c', 'd']
۴. متدهای پرکاربرد لیست
در پایتون، لیست یک شیء (Object) است و متدها توابعی اختصاصی هستند که درون این شیء تعبیه شدهاند. متدها مستقیماً با علامت نقطه روی خود لیست فراخوانی میشوند (list.method()) تا عملیاتهایی مثل افزودن، حذف، جستوجو یا ویرایش دادهها را روی آن انجام دهند.

متد append(x)
- توضیح: عضو جدید
xرا به انتهای لیست اضافه میکند.
students = ["Sara", "Mina"]
students.append("Ali")
print(students) # خروجی: ['Sara', 'Mina', 'Ali']
متد insert(index, x)
- توضیح: عضو
xرا در اندیس دلخواهindexدرج میکند و بقیه اعضا را یک گام به جلو میبرد. - صورت مسئله: میخواهیم یک تسک فوری را در جایگاه اول لیست کارها (اندیس 0) قرار دهیم.
tasks = ["Report", "Email"]
tasks.insert(0, "Emergency Call")
print(tasks) # خروجی: ['Emergency Call', 'Report', 'Email']
متد remove(x)
- توضیح: اولین مقدار برابر با
xرا از لیست حذف میکند. - صورت مسئله: میخواهیم مقدار نامعتبر
0را از لیست ورودی سنسور حذف کنیم.
sensor_readings = [12, 0, 15, 0, 18]
sensor_readings.remove(0)
print(sensor_readings) # خروجی: [12, 15, 0, 18]
متد pop(index)
- توضیح: عضوی که در اندیس مشخص قرار دارد را از لیست حذف کرده و مقدار آن را بازمیگرداند (پیشفرض: آخرین عضو).
- صورت مسئله: میخواهیم آخرین کار ثبتشده در صف تسکها را پردازش و از لیست خارج کنیم.
jobs = ["Job 1", "Job 2", "Job 3"]
last_job = jobs.pop()
print("انجام شد:", last_job) # خروجی: 'Job 3'
print("باقیمانده:", jobs) # خروجی: ['Job 1', 'Job 2']
متد sort()
- توضیح: عناصر لیست را درجا و بهصورت صعودی مرتب میکند.
- صورت مسئله: میخواهیم نمرات کلاسی را از کمترین به بیشترین مرتب کنیم.
grades = [15.5, 12.0, 19.0, 17.5]
grades.sort()
print(grades) # خروجی: [12.0, 15.5, 17.5, 19.0]
متد reverse()
- توضیح: ترتیب اعضای لیست را بهصورت درجا معکوس میکند.
- صورت مسئله: میخواهیم ترتیب نمایش تاریخچه پیامها برعکس شود.
messages = ["Hi", "How are you?", "Bye"]
messages.reverse()
print(messages) # خروجی: ['Bye', 'How are you?', 'Hi']
متد count(x)
- توضیح: تعداد تکرار مقدار
xرا در کل لیست میشمارد. - صورت مسئله: میخواهیم تعداد خطاهای کد 404 را در لاگ سرور به دست آوریم.
status_codes = [200, 404, 200, 404, 500, 404]
error_count = status_codes.count(404)
print("تعداد خطای 404:", error_count) # خروجی: 3
متد index(x)
- توضیح: اندیس (موقعیت) اولین حضور مقدار
xرا در لیست پیدا میکند و برمیگرداند. - صورت مسئله: میخواهیم جایگاه نام کاربری
"admin"را در لیست کاربران پیدا کنیم.
users = ["user1", "admin", "guest", "user2"]
pos = users.index("admin")
print("موقعیت ادمین:", pos) # خروجی: 1
متد extend(iterable)
- توضیح: تمام اعضای یک لیست یا دنباله دیگر را دانه به دانه به انتهای لیست فعلی اضافه و آن را گسترش میدهد.
- صورت مسئله: میخواهیم ورودیهای جدید یک سنسور را به لیست دادههای قبلی متصل کنیم.
data = [10.2, 11.5]
new_data = [12.1, 13.0]
data.extend(new_data)
print("دادههای تجمیعی:", data) # خروجی: [10.2, 11.5, 12.1, 13.0]
متد copy()
- توضیح: یک کپی سطحی (Shallow Copy) و مستقل از لیست در یک آدرس حافظه جدید میسازد تا تغییرات لیست اصلی به کپی منتقل نشود.
- صورت مسئله: میخواهیم قبل از اعمال تغییرات روی سیگنال، یک نسخه پشتیبان از دادههای اولیه داشته باشیم.
original = [100, 200, 300]
backup = original.copy()
original.append(400)
print("لیست اصلی:", original) # خروجی: [100, 200, 300, 400]
print("نسخه پشتیبان:", backup) # خروجی: [100, 200, 300]
متد clear()
- توضیح: تمام عناصر موجود در لیست را بهصورت یکجا پاک کرده و لیست را کاملاً خالی میکند.
- صورت مسئله: میخواهیم بافر دادههای پردازششده را برای چرخه بعدی خالی کنیم.
buffer = [0.45, 0.67, 0.89]
buffer.clear()
print("بافر بعد از پاکسازی:", buffer) # خروجی: []
۵. محدودیت لیستها: عدم پشتیبانی از محاسبات برداری
لیستهای استاندارد پایتون برای محاسبات ریاضی ماتریسی و برداری مناسب نیستند:
- عملگر
+دو لیست را به یکدیگر میچسباند (الحاق یا Concatenate) و مقادیر نظیربهنظیر را جمع نمیزند. - عملگر
*لیست را تکرار میکند، نه اینکه اعضای داخل آن را در عدد ضرب کند.
list_a = [1, 2, 3]
list_b = [4, 5, 6]
print(list_a + list_b) # خروجی: [1, 2, 3, 4, 5, 6]
print(list_a * 2) # خروجی: [1, 2, 3, 1, 2, 3]
نکته: در کاربردهای مهندسی و علوم داده، برای عملیات برداری سریع از آرایههای کتابخانه NumPy استفاده میشود.
مثال کاربردی
مثال ۱: تحلیل نمرات کلاسی
محاسبه میانگین، بالاترین و پایینترین نمره یک دانشجو با استفاده از لیست و توابع توکار:
grades = [17.5, 19.0, 14.25, 20.0, 16.5]
average = sum(grades) / len(grades)
print(f"میانگین: {average:.2f}")
print(f"بیشترین نمره: {max(grades)}")
print(f"کمترین نمره: {min(grades)}")
مثال ۲: فیلتر کردن اعداد زوج از یک لیست
جداسازی دادههای خاص با استفاده از پیمایش لیست:
numbers = [11, 24, 35, 48, 52, 63, 70]
even_numbers = []
for num in numbers:
if num % 2 == 0:
even_numbers.append(num)
print("اعداد زوج:", even_numbers)
مثال ۳: سیستم مدیریت صف نوبتدهی (FIFO)
شبیهسازی ورود مشتریان به صف و نوبتدهی به ترتیب ورود:
queue = ["Customer 1", "Customer 2", "Customer 3"]
# ورود مشتری جدید
queue.append("Customer 4")
# پذیرش نفر اول صف
served = queue.pop(0)
print("پذیرش شد:", served)
print("افراد باقیمانده در صف:", queue)
