برش لیستها در پایتون
برش (Slicing) یکی از ویژگیهای قدرتمند پایتون برای دسترسی به زیرمجموعهای از عناصر یک لیست، رشته، یا تاپل است. با استفاده از برش، میتوان بخش مشخصی از یک دنباله را با استفاده از ایندکسها استخراج کرد.
فرم کلی نوشتار برش بهصورت sequence[start:stop:step]
است، که:
- start: ایندکس شروع (شاملشونده)
- stop: ایندکس پایان (شاملنشونده)
- step: گام یا فاصله بین عناصر (اختیاری)
در صورت حذف هر یک از این مقادیر، مقادیر پیشفرض به ترتیب زیر در نظر گرفته میشوند:
start = 0
stop = len(sequence)
step = 1
squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(squares[2:6]) # عناصر از ایندکس 2 تا 5
print(squares[3:8]) # عناصر از ایندکس 3 تا 7
print(squares[0:1]) # فقط ایندکس 0
خروجی:
[4, 9, 16, 25]
[9, 16, 25, 36, 49]
[0]
نکته: ایندکس انتهایی در برش شامل نمیشود. بنابراین [2:6]
یعنی عناصر ایندکس 2 تا 5.
استفاده از ایندکسهای پیشفرض
print(squares[:7]) # از ابتدا تا ایندکس 6
print(squares[7:]) # از ایندکس 7 تا انتها
خروجی:
[0, 1, 4, 9, 16, 25, 36]
[49, 64, 81]
برش با گام (step)
میتوان با تعیین گام، هر چند عنصر یکبار از لیست مقدار دریافت کرد:
print(squares[::2]) # عناصر زوج ایندکس
print(squares[2:8:3]) # از ایندکس 2 تا 7 با گام 3
خروجی:
[0, 4, 16, 36, 64]
[4, 25]
برش با ایندکس منفی
استفاده از ایندکس منفی، شمارش را از انتهای لیست انجام میدهد:
print(squares[1:-1]) # از ایندکس 1 تا یکی مانده به آخر
خروجی:
[1, 4, 9, 16, 25, 36, 49, 64]
معکوسکردن لیست با برش
استفاده از [::-1]
یک روش متداول برای معکوس کردن لیست، رشته یا تاپل است:
reversed_squares = squares[::-1]
print(reversed_squares)
خروجی:
[81, 64, 49, 36, 25, 16, 9, 4, 1, 0]
پشتیبانی از slicing در دیگر ساختارهای دنبالهای
برش فقط مختص لیستها نیست. ساختارهای دنبالهای مانند رشتهها (str
) و تاپلها (tuple
) نیز از آن پشتیبانی میکنند.
text = "abcdefg"
print(text[::2]) # 'aceg'
t = (10, 20, 30, 40)
print(t[1:3]) # (20, 30)
تغییرات جدید در پایتون 3.10 به بعد
در نسخههای اخیر پایتون، ویژگی slice.indices()
برای جلوگیری از خطای ایندکس خارج از محدوده بسیار بهینه شده است. همچنین، لیستها و سایر ساختارهای دنبالهای بهینهسازیهایی در عملکرد slicing دریافت کردهاند، اما سینتکس و قابلیتهای اصلی slicing تغییری نکرده است.