آموزش جامع لیستها (Lists) در پایتون
🎯 اهداف یادگیری
- درک مفهوم لیستها و کاربرد آنها در پایتون
- شناخت روشهای مختلف ایجاد و مقداردهی لیستها
- یادگیری دسترسی و تغییر عناصر لیست
- آشنایی با متدهای پرکاربرد لیستها
- یادگیری لیست کامپرهنشن و عملیاتهای پیشرفته
📌 مقدمهای بر لیستها در پایتون
لیستها یکی از پرکاربردترین ساختارهای داده در پایتون هستند که برای ذخیره مجموعهای از آیتمها به صورت ترتیبی استفاده میشوند. لیستها تغییرپذیر (Mutable) هستند، یعنی میتوان محتوای آنها را پس از ایجاد تغییر داد.
📌 ایجاد و مقداردهی لیستها
لیستها در پایتون با استفاده از براکتهای مربعی [ ] ایجاد میشوند:
# ایجاد لیست خالیempty_list = []empty_list2 = list()# ایجاد لیست با مقادیر اولیهnumbers = [1, 2, 3, 4, 5]fruits = ["apple", "banana", "cherry"]# لیست با انواع مختلف دادهmixed_list = [1, "hello", True, 3.14]# لیست تودرتو (Nested List)nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]print(numbers)print(fruits)print(mixed_list)print(nested_list)
ویژگیهای مهم لیستها:
- تغییرپذیر (Mutable): میتوان عناصر را تغییر داد، اضافه یا حذف کرد
- ترتیبی (Ordered): عناصر به ترتیب اضافه شدن ذخیره میشوند
- پویا (Dynamic): اندازه لیست میتواند تغییر کند
- قابل تکراری (Iterable): میتوان روی عناصر آن حلقه زد
- همگن یا ناهمگن: میتواند شامل انواع مختلف داده باشد
📌 دسترسی به عناصر لیست
برای دسترسی به عناصر لیست از اندیس (index) استفاده میشود. اندیسها از صفر شروع میشوند:
fruits = ["apple", "banana", "cherry", "date", "elderberry"]# دسترسی به عناصر با اندیس مثبتprint(fruits[0]) # خروجی: appleprint(fruits[2]) # خروجی: cherry# دسترسی به عناصر با اندیس منفی (شروع از انتها)print(fruits[-1]) # خروجی: elderberryprint(fruits[-2]) # خروجی: date# برش زدن لیست (Slicing)print(fruits[1:4]) # خروجی: ['banana', 'cherry', 'date']print(fruits[:3]) # خروجی: ['apple', 'banana', 'cherry']print(fruits[2:]) # خروجی: ['cherry', 'date', 'elderberry']print(fruits[::-1]) # خروجی: ['elderberry', 'date', 'cherry', 'banana', 'apple']
نکات مهم در دسترسی به لیست:
- اندیسگذاری: اندیس اول همیشه 0 است
- اندیس منفی: از انتهای لیست شروع به شمارش میکند
- برش زدن: از الگوی [start:stop:step] پیروی میکند
- خطای IndexError: اگر اندیس خارج از محدوده باشد رخ میدهد
📌 تغییر و بهروزرسانی لیست
به دلیل تغییرپذیر بودن لیستها، میتوان عناصر آنها را تغییر داد:
numbers = [1, 2, 3, 4, 5]# تغییر یک عنصرnumbers[2] = 10print(numbers) # خروجی: [1, 2, 10, 4, 5]# تغییر چندین عنصر با برش زدنnumbers[1:3] = [20, 30]print(numbers) # خروجی: [1, 20, 30, 4, 5]# اضافه کردن عنصر به انتهای لیستnumbers.append(6)print(numbers) # خروجی: [1, 20, 30, 4, 5, 6]# درج عنصر در موقعیت خاصnumbers.insert(2, 25)print(numbers) # خروجی: [1, 20, 25, 30, 4, 5, 6]
📌 متدهای پرکاربرد لیست
لیستها در پایتون متدهای داخلی زیادی دارند که کار با آنها را آسان میکند:
my_list = [3, 1, 4, 1, 5, 9, 2]# اضافه کردن عنصر به انتهاmy_list.append(6)print(my_list) # [3, 1, 4, 1, 5, 9, 2, 6]# حذف عنصر با مقدار مشخصmy_list.remove(1)print(my_list) # [3, 4, 1, 5, 9, 2, 6]# حذف عنصر با اندیس و بازگرداندن آنpopped = my_list.pop(2)print("حذف شده:", popped) # حذف شده: 1print(my_list) # [3, 4, 5, 9, 2, 6]# پیدا کردن اندیس یک عنصرindex = my_list.index(5)print("اندیس 5:", index) # اندیس 5: 2# شمارش تعداد تکرار یک عنصرcount = my_list.count(9)print("تعداد 9:", count) # تعداد 9: 1# مرتب کردن لیستmy_list.sort()print("مرتب شده:", my_list) # مرتب شده: [2, 3, 4, 5, 6, 9]# معکوس کردن لیستmy_list.reverse()print("معکوس شده:", my_list) # معکوس شده: [9, 6, 5, 4, 3, 2]# پاک کردن تمام عناصر لیستmy_list.clear()print("لیست خالی:", my_list) # لیست خالی: []
جدول متدهای مهم لیست:
متد | توضیح | مثال |
---|---|---|
append(x) | اضافه کردن x به انتهای لیست | list.append(5) |
insert(i, x) | درج x در موقعیت i | list.insert(2, 10) |
remove(x) | حذف اولین occurrence از x | list.remove(5) |
pop([i]) | حذف و بازگرداندن عنصر در موقعیت i | list.pop(3) |
clear() | حذف تمام عناصر لیست | list.clear() |
index(x) | بازگرداندن اندیس اولین occurrence از x | list.index(10) |
count(x) | شمارش تعداد تکرار x در لیست | list.count(5) |
sort() | مرتب کردن لیست | list.sort() |
reverse() | معکوس کردن ترتیب عناصر لیست | list.reverse() |
copy() | ایجاد یک کپی از لیست | new_list = list.copy() |
📌 عملیاتهای روی لیستها
میتوان عملیاتهای مختلفی روی لیستها انجام داد:
list1 = [1, 2, 3]list2 = [4, 5, 6]# الحاق لیستهاcombined = list1 + list2print(combined) # [1, 2, 3, 4, 5, 6]# تکرار لیستrepeated = list1 * 3print(repeated) # [1, 2, 3, 1, 2, 3, 1, 2, 3]# بررسی وجود عنصر در لیستprint(2 in list1) # Trueprint(7 not in list1) # True# پیدا کردن طول لیستprint(len(list1)) # 3# پیدا کردن کوچکترین و بزرگترین مقدارprint(min(list1)) # 1print(max(list1)) # 3# جمع عناصر لیست (برای اعداد)print(sum(list1)) # 6
📌 پیمایش لیستها
برای پیمایش عناصر لیست میتوان از حلقههای مختلف استفاده کرد:
fruits = ["apple", "banana", "cherry", "date"]# پیمایش با حلقه for (مقدار)for fruit in fruits: print(fruit)# پیمایش با حلقه for (اندیس و مقدار)for index, fruit in enumerate(fruits): print(index, fruit)# پیمایش با حلقه whilei = 0while i < len(fruits): print(fruits[i]) i += 1# پیمایش با List Comprehensionupper_fruits = [fruit.upper() for fruit in fruits]print(upper_fruits) # ['APPLE', 'BANANA', 'CHERRY', 'DATE']
📌 List Comprehension
لیست کامپرهنشن یک روش فشرده و کارآمد برای ایجاد لیستهای جدید بر اساس لیستهای موجود است:
numbers = [1, 2, 3, 4, 5]# ایجاد لیست جدید با مربع اعدادsquares = [x ** 2 for x in numbers]print(squares) # [1, 4, 9, 16, 25]# فیلتر کردن اعداد زوجeven_numbers = [x for x in numbers if x % 2 == 0]print(even_numbers) # [2, 4]# ایجاد لیست از رشتههاwords = ["hello", "world", "python"]lengths = [len(word) for word in words]print(lengths) # [5, 5, 6]# ایجاد لیست از چندین حلقهpairs = [(x, y) for x in [1, 2, 3] for y in [4, 5]]print(pairs) # [(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)]
مزایای List Comprehension:
- خوانایی بیشتر: کد فشرده و قابل فهمتر
- کارایی بهتر: سریعتر از حلقههای عادی است
- انعطافپذیری: امکان فیلتر کردن و تبدیل دادهها
📌 کپی کردن لیستها
برای جلوگیری از تغییرات ناخواسته، باید با دقت لیستها را کپی کنید:
original = [1, 2, 3]# کپی سطحی (Shallow Copy) - روش نادرستcopy_wrong = originalcopy_wrong[0] = 10print("Original:", original) # Original: [10, 2, 3] (تغییر کرد!)# کپی سطحی (Shallow Copy) - روشهای صحیحoriginal = [1, 2, 3]copy1 = original[:] # استفاده از slicingcopy2 = list(original) # استفاده از constructorcopy3 = original.copy() # استفاده از متد copycopy1[0] = 10print("Original:", original) # Original: [1, 2, 3] (تغییر نکرد)print("Copy:", copy1) # Copy: [10, 2, 3]# کپی عمیق (Deep Copy) برای لیستهای تودرتوimport copynested_list = [1, [2, 3], 4]deep_copy = copy.deepcopy(nested_list)deep_copy[1][0] = 20print("Original:", nested_list) # Original: [1, [2, 3], 4] (تغییر نکرد)print("Deep Copy:", deep_copy) # Deep Copy: [1, [20, 3], 4]
📌 تمرینهای عملی
حالا نوبت شماست! کدهای زیر را بررسی کنید و نتیجه را پیشبینی کنید:
# تمرین ۱numbers = [1, 2, 3, 4, 5]numbers[1:4] = [10, 20]print(numbers)# تمرین ۲fruits = ["apple", "banana", "cherry"]result = [f.upper() for f in fruits if "a" in f]print(result)# تمرین ۳list1 = [1, 2, 3]list2 = list1list2.append(4)print(list1)