پیش‌نیاز و هدف یادگیری

این بخش، گام 12 از مسیر «پایتون از صفر» است. هدف این درس استفاده از set برای تشخیص تکرار و list برای حفظ ترتیب است. پیش‌نیاز: منطق بولی و any؛ ساخت یک بررسی‌گر آموزشی. کتابخانهٔ خارجی لازم نیست؛ ماژول‌های استاندارد همراه Python 3 هستند. اگر مفهوم قبلی برایتان ناآشناست، ابتدا مقالهٔ پیش‌نیاز را بخوانید و مثالش را اجرا کنید؛ حفظ‌کردن کد جای فهم ورودی و خروجی را نمی‌گیرد.

مفهوم اصلی به زبان ساده

مجموعه یا set عضوهای یکتا نگه می‌دارد و برای تشخیص اینکه چیزی قبلاً دیده شده مناسب است. اما ترتیب پیمایش set را نباید قرارداد خروجی در نظر گرفت. اگر می‌خواهیم فهرست یکتا با ترتیب اولین مشاهده داشته باشیم، از دو ساختار استفاده می‌کنیم: مجموعه برای بررسی تکرار و لیست برای ترتیب نمایش.

مسئلهٔ این درس

در پروژهٔ «فهرست یکتای شرکت‌کنندگان» باید یک تابع مستقل بنویسید. میزکار ورودی نمونه را در request.json قرار می‌دهد؛ تابع solve دیکشنری داده را می‌گیرد و نتیجهٔ خود را برمی‌گرداند. در این قرارداد input لازم نیست و خواندن تعاملی از ترمینال ممکن است اجرای ارزیابی را متوقف کند. از مثال زیر شروع کنید و پیش از اجرای آن، شکل نتیجه را حدس بزنید.

نمونه‌کد قابل اجرا

def solve(data):
    seen, unique = set(), []
    for name in data['names']:
        if name not in seen:
            seen.add(name)
            unique.append(name)
    return {'unique': unique, 'removed': len(data['names']) - len(unique)}

print(solve({'names': ['سارا', 'علی', 'سارا', 'رضا', 'علی']}))

نتیجهٔ مورد انتظار

{
  "unique": [
    "سارا",
    "علی",
    "رضا"
  ],
  "removed": 2
}

توضیح مرحله‌به‌مرحله

برای هر نام، ابتدا آن را در seen جست‌وجو می‌کنیم. اگر قبلاً دیده نشده باشد، هم به seen و هم به unique اضافه می‌شود. نام تکراری فقط از خروجی یکتا حذف می‌شود و تعداد تکرارها در removed گزارش می‌شود. ورودی شامل رشته‌هاست؛ مقایسه دقیق است و حروف کوچک و بزرگ خودبه‌خود یکی نمی‌شوند.

قرارداد ورودی و خروجی

مثال فقط یک ورودی است، نه همهٔ مسئله. مقدارها را از data بخوانید و جواب نمونه را ثابت در برنامه ننویسید. نام کلیدها، نوع عدد و رشته و ترتیب فهرست‌ها بخشی از قراردادند. در پروژه، بخش پایانی main.py نتیجهٔ تابع را در result.json ذخیره می‌کند؛ آن بخش را نگه دارید. موفقیت اجرای برنامه با درست‌بودن پاسخ و قبولی ارزیابی یکسان نیست.

خطای رایج و راه تشخیص

تبدیل مستقیم list(set(names)) ترتیب اولین مشاهده را تضمین نمی‌کند. همچنین set نمی‌تواند دیکشنری یا لیست را مستقیم عضو بگیرد، چون این نوع‌ها هش‌پذیر نیستند. قرارداد فعلی رشته‌ای است؛ برای دادهٔ پیچیده باید کلید یکتای مشخصی تعریف شود.

تمرین مستقل و خودآزمایی

ورودی [سارا، علی، سارا، رضا، علی] را دنبال کنید. سپس تصمیم بگیرید آیا نام با فاصلهٔ اضافی باید همان نام قبلی حساب شود؛ تغییر این تصمیم نیازمند تغییر قرارداد است.

برای هر آزمایش، ورودی، خروجی مورد انتظار و خروجی واقعی را جدا بنویسید. اگر تفاوتی دیدید، یک نمونهٔ کوچک‌تر بسازید و تغییر را دوباره امتحان کنید. به جای اجرای چند تغییر هم‌زمان، هر بار یک فرض را بررسی کنید. پس از فهم نمونه، پروژهٔ مرتبط را در میزکار حل کنید؛ ارزیابی با چند ورودی متفاوت انجام می‌شود و پاسخ ثابت نمونه پذیرفته نخواهد شد.

گام بعدی

موضوع‌های این درس: set · Membership · Order. اگر می‌توانید دلیل هر خط را توضیح دهید و ورودی تازه‌ای را بدون دست‌کاری منطق اصلی حل کنید، به مقالهٔ بعدی بروید. هدف مسیر مقدماتی، تسلط بر همین رفتارهای کوچک و قابل آزمایش است؛ برای شروع پروژه‌های یادگیری ماشین عجله نکنید.

منابع و مطالعهٔ بیشتر

برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.