فصل ۴: ساختارهای داده — list، tuple، dict، set و collections

tuple، unpacking و set

داده‌ی ثابت و مجموعه‌ی بی‌تکرار

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)    # تفاضل متقارن: فقط در یکی
ویژگیlisttupleset
ترتیبداردداردندارد
تکرارمجازمجازخیر
تغییرپذیربلهخیربله (frozenset: خیر)
سرعت inکند (خطی)کند (خطی)تقریباً فوری
اندیسبلهبلهخیر

نکته‌هایی که کمتر کسی می‌داند

  • (5) تاپل نیست، فقط عدد 5 در پرانتز است؛ تاپل تک‌عضوی ویرگول می‌خواهد: (5,). همین ویرگول جاافتاده در انتهای یک خط، x = 5, را بی‌صدا به تاپل تبدیل می‌کند.
  • {} دیکشنری خالی است، نه set خالی؛ set خالی را فقط با set() می‌سازید.
  • tuple تغییرناپذیر است، اما اگر عضوی تغییرپذیر (مثل لیست) داشته باشد، آن عضو هنوز قابل تغییر است؛ و چنین tupleی دیگر نمی‌تواند کلید دیکشنری باشد.
  • list(dict.fromkeys(items)) سریع‌ترین راه حذف تکرار با حفظ ترتیب است؛ set ترتیب را به هم می‌ریزد.
  • ترتیب چاپ اعضای یک set از رشته‌ها ممکن است در هر اجرای برنامه فرق کند (hash تصادفی رشته‌ها)؛ هرگز به ترتیب set تکیه نکنید.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.