دادهی ثابت و مجموعهی بیتکرار
tuple مثل list است اما تغییرناپذیر. با پرانتز یا فقط با ویرگول ساخته میشود: size = (200, 300) یا size = 200, 300. چرا باید چیزی را بخواهیم که نمیشود تغییرش داد؟ چون تغییرناپذیری یک قول است: tuple میگوید «این رکورد ثابت است»؛ مختصات، ابعاد فرش، تاریخ به شکل (سال، ماه، روز). بهعلاوه tuple میتواند کلید دیکشنری و عضو set باشد، ولی list نه.
قاعدهی عملی: list برای مجموعهای از چیزهای همجنس با تعداد متغیر، tuple برای یک رکورد با ساختار ثابت که هر جایگاهش معنای خاصی دارد.
unpacking: باز کردن در یک خط
rug = ("KSH-101", 200, 300, "ابریشم")
code, width, length, material = rug
first, *middle, last = [3, 8, 1, 9, 4]
print(first, middle, last) # 3 [8, 1, 9] 4
*_, latest = ["1403/01/05", "1403/02/11", "1403/03/20"]
print(latest) # 1403/03/20
for name, (w, l) in [("قالیچه", (100, 150)), ("پادری", (60, 90))]:
print(name, w * l)
ستاره (*) «هر چند عضو باقیمانده» را در یک لیست جمع میکند و در هر unpacking فقط یک بار میتواند بیاید. unpacking روی هر iterableی کار میکند؛ اگر تعداد جور نباشد، ValueError میگیرید که در واقع یک بررسی رایگان است.
set: عضویت سریع و حذف تکرار
set مجموعهای بیترتیب از اعضای یکتا است. دو کاربرد اصلی دارد: حذف تکراریها و پاسخ فوری به سؤال «آیا x عضو است؟».
codes = ["K1", "T1", "K1", "M2", "T1"]
unique = set(codes) # {'K1', 'T1', 'M2'}
ordered_unique = list(dict.fromkeys(codes)) # ['K1', 'T1', 'M2'] با حفظ ترتیب
kashan = {"ابریشم", "پشم", "نخ"}
tabriz = {"پشم", "نخ", "اکریلیک"}
print(kashan & tabriz) # اشتراک: {'پشم', 'نخ'}
print(kashan | tabriz) # اجتماع
print(tabriz - kashan) # تفاضل: {'اکریلیک'}
print(kashan ^ tabriz) # تفاضل متقارن: فقط در یکی
| ویژگی | list | tuple | set |
|---|---|---|---|
| ترتیب | دارد | دارد | ندارد |
| تکرار | مجاز | مجاز | خیر |
| تغییرپذیر | بله | خیر | بله (frozenset: خیر) |
سرعت in | کند (خطی) | کند (خطی) | تقریباً فوری |
| اندیس | بله | بله | خیر |
نکتههایی که کمتر کسی میداند
(5)تاپل نیست، فقط عدد 5 در پرانتز است؛ تاپل تکعضوی ویرگول میخواهد:(5,). همین ویرگول جاافتاده در انتهای یک خط،x = 5,را بیصدا به تاپل تبدیل میکند.{}دیکشنری خالی است، نه set خالی؛ set خالی را فقط باset()میسازید.- tuple تغییرناپذیر است، اما اگر عضوی تغییرپذیر (مثل لیست) داشته باشد، آن عضو هنوز قابل تغییر است؛ و چنین tupleی دیگر نمیتواند کلید دیکشنری باشد.
list(dict.fromkeys(items))سریعترین راه حذف تکرار با حفظ ترتیب است؛setترتیب را به هم میریزد.- ترتیب چاپ اعضای یک set از رشتهها ممکن است در هر اجرای برنامه فرق کند (hash تصادفی رشتهها)؛ هرگز به ترتیب set تکیه نکنید.