از تعریف و اندیسگذاری تا برش (slicing)، متدهای افزودن، حذف و مرتبسازی، حلقه for روی لیست و تمرینات عملی | آکادمی غیاثی
لیست (List) یکی از پرکاربردترین ساختارهای داده در پایتون است. یک لیست مانند یک جعبه بزرگ است که میتوانید هر چیزی را داخل آن بگذارید: اعداد، رشتهها، مقادیر درست/غلط، و حتی لیستهای دیگر!
سادهترین راه. عناصر را داخل [] قرار میدهیم و با کاما جدا میکنیم.
a = [1, 2, 3, 4, 5]
b = ['apple', 'banana', 'cherry']
c = [1, 'hello', 3.14, True]
print(a)
print(b)
print(c)
با تابع list() میتوان از هر چیزی که «قابل پیمایش» است (مثل رشته، تاپل، محدوده اعداد) یک لیست ساخت.
a = list((1, 2, 3)) # از تاپل
b = list('Python') # از رشته
c = list(range(5)) # از محدوده اعداد 0 تا 4
print(a)
print(b)
print(c)
با استفاده از عملگر * میتوان یک لیست را چند بار تکرار کرد.
a = [2] * 5 # [2, 2, 2, 2, 2]
b = [0] * 7 # [0, 0, 0, 0, 0, 0, 0]
print(a)
print(b)
* باعث تکرار ارجاع میشود (نه کپی مستقل). بعداً در بخش اشتباهات رایج توضیح میدهیم.
اولین عنصر اندیس 0 دارد، دومین عنصر اندیس 1 و آخرین عنصر اندیس n-1 (که n طول لیست است).
a = [10, 20, 30, 40, 50]
print(a[0]) # 10 (اولین)
print(a[2]) # 30 (سومین)
print(a[4]) # 50 (آخرین)
با اندیسهای منفی میتوان از انتهای لیست به عناصر دسترسی پیدا کرد. -1 آخرین عنصر، -2 یکی مانده به آخر و ... است.
a = [10, 20, 30, 40, 50]
print(a[-1]) # 50 (آخرین)
print(a[-2]) # 40 (یکی مانده به آخر)
print(a[-5]) # 10 (اولین)
a[-i] = a[len(a)-i]با برش میتوانید بخشی از یک لیست را استخراج کنید. فرمت: [start:end:step]
a = [10, 20, 30, 40, 50]
print(a[1:4]) # [20, 30, 40] (از اندیس 1 تا قبل از 4)
print(a[:3]) # [10, 20, 30] (از ابتدا تا قبل از 3)
print(a[2:]) # [30, 40, 50] (از اندیس 2 تا انتها)
print(a[::2]) # [10, 30, 50] (قدم 2)
print(a[::-1]) # [50, 40, 30, 20, 10] (برعکس)
start شامل میشود، end شامل نمیشود.start خالی باشد، از ابتدا شروع میشود.end خالی باشد، تا انتها ادامه مییابد.step مشخص میکند با چه قدمی حرکت کنیم. step=-1 یعنی برعکس.
یک عنصر را به آخر لیست اضافه میکند.
a = [1, 2, 3]
a.append(4)
print(a) # [1, 2, 3, 4]
عنصر x را در اندیس i قرار میدهد. عناصر بعدی به سمت راست حرکت میکنند.
a = [1, 2, 3]
a.insert(1, 99)
print(a) # [1, 99, 2, 3]
همه عناصر یک تکرارپذیر (مثل لیست دیگر) را به انتهای لیست اضافه میکند.
a = [1, 2, 3]
a.extend([4, 5, 6])
print(a) # [1, 2, 3, 4, 5, 6]
extend() و append(): append([4,5]) کل لیست را به عنوان یک عضو اضافه میکند، اما extend([4,5]) هر عضو را جدا اضافه میکند.لیستها تغییرپذیرند، بنابراین میتوان مقدار یک عنصر را با اندیس آن تغییر داد.
a = [10, 20, 30, 40]
a[1] = 25
print(a) # [10, 25, 30, 40]
اولین رخداد مقدار x را حذف میکند. اگر مقدار وجود نداشته باشد، خطا میدهد.
a = [10, 20, 30, 20]
a.remove(20)
print(a) # [10, 30, 20]
عنصر در اندیس i را حذف کرده و آن را برمیگرداند. اگر اندیس ندهیم، آخرین عنصر را حذف میکند.
a = [10, 20, 30, 40]
val = a.pop(1)
print(val) # 20
print(a) # [10, 30, 40]
a = [10, 20, 30, 40]
del a[0]
print(a) # [20, 30, 40]
pop و del: pop مقدار حذف شده را برمیگرداند، اما del فقط حذف میکند.
حلقه `for` یکی از قدرتمندترین ابزارها در پایتون است. با استفاده از حلقه `for` میتوانید روی همه عناصر یک لیست پیمایش کنید و برای هر عنصر یک کار مشخص انجام دهید. تصور کنید یک جعبه پر از میوه دارید و میخواهید هر میوه را جداگانه بررسی کنید — حلقه `for` دقیقاً همین کار را با لیستها انجام میدهد.
در این روش، متغیر حلقه مستقیماً مقدار هر عنصر را میگیرد. اگر فقط به خود عناصر نیاز دارید و نیازی به شماره اندیس ندارید، این روش بهترین انتخاب است.
fruits = ['apple', 'banana', 'cherry', 'date']
for fruit in fruits:
print(fruit)
خروجی:
apple
banana
cherry
date
fruit در هر بار اجرای حلقه، مقدار یکی از اعضای لیست را میگیرد. نام این متغیر را میتوانید هر چیزی بگذارید (مثل item، x، element و ...).scores = [18, 15, 19, 14, 17]
new_scores = []
for score in scores:
new_scores.append(score + 2)
print(new_scores) # [20, 17, 21, 16, 19]
گاهی نیاز داریم هم به اندیس (موقعیت) عنصر دسترسی داشته باشیم و هم به خود عنصر. مثلاً بخواهیم بدانیم کدام عنصر در کدام خانه لیست قرار دارد. در این روش از ترکیب range() و len() استفاده میکنیم.
fruits = ['apple', 'banana', 'cherry', 'date']
for i in range(len(fruits)):
print(f'اندیس {i}: {fruits[i]}')
خروجی:
اندیس 0: apple
اندیس 1: banana
اندیس 2: cherry
اندیس 3: date
len(fruits) طول لیست را برمیگرداند (مثلاً 4).range(4) اعداد 0، 1، 2، 3 را تولید میکند.fruits[i] به عنصر متناظر با آن اندیس دسترسی پیدا میکنیم.
fruits = ['apple', 'banana', 'cherry', 'date']
for i in range(len(fruits)):
if fruits[i] == 'cherry':
print(f'cherry در اندیس {i} قرار دارد')
تابع enumerate() بهترین و خواناترین روش برای پیمایش زمانی است که هم به اندیس و هم به مقدار نیاز دارید. این تابع برای هر عنصر لیست یک جفت (اندیس، مقدار) برمیگرداند.
fruits = ['apple', 'banana', 'cherry', 'date']
for index, fruit in enumerate(fruits):
print(f'اندیس {index}: {fruit}')
خروجی: (همانند روش قبل)
range(len()) نیست.enumerate(fruits, start=1)fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits, start=1):
print(f'{index}: {fruit}')
خروجی:
1: apple
2: banana
3: cherry
اگر میخواهید عناصر لیست را در حین پیمایش تغییر دهید، باید از روش ایندکسی استفاده کنید (روش دوم یا سوم با اندیس). روش اول (پیمایش مستقیم) نمیتواند عناصر اصلی لیست را تغییر دهد.
numbers = [1, 2, 3, 4, 5]
for n in numbers:
n = n * 2 # این فقط متغیر حلقه را تغییر میدهد، نه لیست اصلی
print(numbers) # [1, 2, 3, 4, 5] (تغییر نکرده!)
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers)):
numbers[i] = numbers[i] * 2
print(numbers) # [2, 4, 6, 8, 10]
| روش | مزایا | معایب | زمان استفاده |
|---|---|---|---|
for item in list: |
ساده، خوانا، کوتاه | دسترسی به اندیس نداریم، نمیتوان لیست را تغییر داد | وقتی فقط به مقادیر نیاز دارید |
for i in range(len(list)): |
دسترسی به اندیس، امکان تغییر لیست | کد طولانیتر، نیاز به list[i] |
وقتی نیاز به اندیس یا تغییر لیست دارید |
for i, item in enumerate(list): |
دسترسی همزمان به اندیس و مقدار، خوانا، حرفهای | هیچ (این بهترین روش است) | زمانی که هم به اندیس و هم به مقدار نیاز دارید |
for item in list:for i in range(len(list)):for i, item in enumerate(list):
for و روش enumerate، اعداد زوج را به همراه اندیس آنها چاپ کنید.for و روش ایندکسی، همه اعداد لیست را ۳ برابر کنید و لیست جدید را چاپ کنید.در پایتون، توابع و متدهای آمادهای وجود دارند که کار با لیستها را بسیار آسان میکنند. در این بخش هر کدام را با جزئیات کامل یاد میگیریم.
len() و sum()، به صورت عمومی استفاده میشوند: len(list)list.sort()
تابع len() تعداد عناصر موجود در یک لیست را برمیگرداند. این تابع برای هر نوع لیستی کار میکند.
a = [10, 20, 30, 40, 50]
b = ['apple', 'banana']
c = []
print(len(a)) # 5
print(len(b)) # 2
print(len(c)) # 0 (لیست خالی)
len() معمولاً در حلقههای for برای پیمایش با ایندکس استفاده میشود: for i in range(len(my_list))تابع sum() مجموع همه عناصر عددی یک لیست را محاسبه میکند. این تابع فقط برای لیستهایی کار میکند که همه عناصرشان عدد باشند.
numbers = [10, 20, 30, 40, 50]
print(sum(numbers)) # 150
print(sum([1, 2, 3])) # 6
sum() خطا میدهد.
# این کد خطا میدهد:
a = [1, 2, 'hello']
print(sum(a)) # TypeError!
تابع min() کوچکترین (کمینه) عنصر را در لیست پیدا میکند.
numbers = [50, 10, 40, 20, 30]
names = ['ali', 'reza', 'sara']
print(min(numbers)) # 10
print(min(names)) # 'ali' (بر اساس ترتیب حروف الفبا)
تابع max() بزرگترین (بیشینه) عنصر را در لیست پیدا میکند.
numbers = [50, 10, 40, 20, 30]
names = ['ali', 'reza', 'sara']
print(max(numbers)) # 50
print(max(names)) # 'sara' (بر اساس ترتیب حروف الفبا)
متد sort() عناصر لیست را به صورت صعودی (از کوچک به بزرگ) مرتب میکند. این متد خود لیست را تغییر میدهد و چیزی برنمیگرداند.
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
مرتبسازی نزولی (از بزرگ به کوچک):
numbers = [3, 1, 4, 1, 5]
numbers.sort(reverse=True)
print(numbers) # [5, 4, 3, 1, 1]
sort() خود لیست اصلی را تغییر میدهد و مقدار بازگشتی آن None است. پس نمیتوانید نتیجه را در متغیر جدید ذخیره کنید.تابع sorted() مانند sort() عمل میکند، اما لیست اصلی را تغییر نمیدهد و یک لیست جدید مرتب شده برمیگرداند.
original = [3, 1, 4, 1, 5]
sorted_list = sorted(original)
print(sorted_list) # [1, 1, 3, 4, 5]
print(original) # [3, 1, 4, 1, 5] (تغییر نکرده)
| ویژگی | sort() | sorted() |
|---|---|---|
| تغییر لیست اصلی | ✅ بله (in-place) | ❌ خیر |
| مقدار بازگشتی | None | لیست جدید مرتب شده |
| نوع | متد | تابع |
| مناسب برای | وقتی لیست اصلی را نیاز نداریم | وقتی میخواهیم هر دو نسخه را داشته باشیم |
متد count() تعداد دفعات تکرار یک مقدار مشخص را در لیست شمارش میکند.
numbers = [1, 2, 3, 1, 1, 4, 1, 5]
print(numbers.count(1)) # 4 (چهار بار عدد 1 تکرار شده)
print(numbers.count(10)) # 0 (عدد 10 وجود ندارد)
متد index() اولین اندیسی که یک مقدار مشخص در آن قرار دارد را برمیگرداند. اگر مقدار پیدا نشود، خطا میدهد.
fruits = ['apple', 'banana', 'cherry', 'banana', 'date']
print(fruits.index('banana')) # 1 (اولین banana در اندیس 1 است)
print(fruits.index('grape')) # ValueError! (پیدا نشد)
index() بررسی کنید که مقدار وجود دارد یا از in استفاده کنید.متد reverse() ترتیب عناصر لیست را برعکس میکند (آخرین عنصر میشود اولین). این متد خود لیست را تغییر میدهد.
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers) # [5, 4, 3, 2, 1]
اگر میخواهید لیست اصلی تغییر نکند، از برش با [::-1] استفاده کنید:
numbers = [1, 2, 3, 4, 5]
reversed_list = numbers[::-1]
print(reversed_list) # [5, 4, 3, 2, 1]
print(numbers) # [1, 2, 3, 4, 5] (تغییر نکرده)
متد copy() یک کپی سطحی (shallow copy) از لیست میسازد.
original = [1, 2, 3]
new_list = original.copy()
new_list.append(4)
print(original) # [1, 2, 3] (تغییر نکرده)
print(new_list) # [1, 2, 3, 4]
new = old کپی نمیکند! فقط یک ارجاع جدید به همان لیست میسازد.
a = [1, 2, 3]
b = a # این کپی نیست، هر دو به یک لیست اشاره دارند
b.append(4)
print(a) # [1, 2, 3, 4] (a هم تغییر کرد!)
برای کپی واقعی از copy() یا a[:] استفاده کنید.
متد clear() همه عناصر لیست را حذف میکند و لیست را خالی میکند.
numbers = [1, 2, 3, 4, 5]
numbers.clear()
print(numbers) # []
| نام | نوع | توضیح | مثال | تغییر لیست اصلی؟ |
|---|---|---|---|---|
len() |
تابع | تعداد عناصر لیست | len([1,2,3]) → 3 |
❌ |
sum() |
تابع | جمع عناصر عددی | sum([1,2,3]) → 6 |
❌ |
min() |
تابع | کوچکترین عنصر | min([3,1,2]) → 1 |
❌ |
max() |
تابع | بزرگترین عنصر | max([3,1,2]) → 3 |
❌ |
sort() |
متد | مرتبسازی صعودی | [3,1,2].sort() → [1,2,3] |
✅ |
sorted() |
تابع | مرتبسازی (لیست جدید) | sorted([3,1,2]) → [1,2,3] |
❌ (لیست جدید میسازد) |
reverse() |
متد | برعکس کردن ترتیب | [1,2,3].reverse() → [3,2,1] |
✅ |
count(x) |
متد | تعداد x در لیست | [1,2,1].count(1) → 2 |
❌ |
index(x) |
متد | اندیس اولین x | ['a','b'].index('b') → 1 |
❌ |
copy() |
متد | کپی کردن لیست | [1,2].copy() → [1,2] |
❌ (لیست جدید میسازد) |
clear() |
متد | خالی کردن لیست | [1,2].clear() → [] |
✅ |
sum(numbers) / len(numbers)index()، وجود مقدار را با if x in list: بررسی کنید.new = old استفاده نکنید. از new = old.copy() یا new = old[:] استفاده کنید.sort() استفاده کنید (کارآمدتر است).
لیست تودرتو یعنی لیستی که عناصر آن خود لیست هستند. مانند یک جدول یا ماتریس.
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[0]) # [1, 2, 3]
print(matrix[1][2]) # 6
matrix[1][2] یعنی: برو به سطر دوم (اندیس 1) و سپس ستون سوم (اندیس 2).لیستها مقادیر را مستقیماً ذخیره نمیکنند، بلکه مراجع (اشارهگر) به اشیاء در حافظه را ذخیره میکنند. به همین دلیل است که لیست میتواند انواع مختلف داده را کنار هم نگه دارد.
a = [10, 'hello', 3.14, True]
print(a[0]) # 10 (اشاره به عدد)
print(a[1]) # hello (اشاره به رشته)
a[1] دومین عنصر است، نه اولین.append به جای extend: a.append([4,5]) کل لیست را یک عضو اضافه میکند، اما a.extend([4,5]) اعضا را جدا اضافه میکند.*: [[]] * 3 یک لیست با سه ارجاع به یک لیست داخلی میسازد.a = [[0]] * 3 # این اشتباه است!
a[0][0] = 1
print(a) # [[1], [1], [1]] (همه تغییر کردند!)
راهحل: از حلقه یا [[0] for _ in range(3)] استفاده کنید.
max() و min() پیدا کنید.
sort() مرتب کنید و سپس برعکس آن را چاپ کنید.
| متد | توضیح | مثال |
|---|---|---|
append(x) | اضافه کردن x به انتهای لیست | a.append(5) |
insert(i, x) | درج x در اندیس i | a.insert(1, 99) |
extend(iter) | اضافه کردن عناصر یک تکرارپذیر | a.extend([4,5]) |
remove(x) | حذف اولین رخداد x | a.remove(20) |
pop(i) | حذف و بازگرداندن عنصر در اندیس i | val = a.pop(2) |
sort() | مرتبسازی لیست (تغییر در خود لیست) | a.sort() |
clear() | خالی کردن لیست | a.clear() |