پیشنیاز و هدف یادگیری
این بخش، گام 9 از مسیر «پایتون از صفر» است. هدف این درس تجمیع تعداد کالاهای تکراری با کلید رشتهای است. پیشنیاز: فیلترکردن لیست؛ جستوجوی متنی قابل پیشبینی. کتابخانهٔ خارجی لازم نیست؛ ماژولهای استاندارد همراه Python 3 هستند. اگر مفهوم قبلی برایتان ناآشناست، ابتدا مقالهٔ پیشنیاز را بخوانید و مثالش را اجرا کنید؛ حفظکردن کد جای فهم ورودی و خروجی را نمیگیرد.
مفهوم اصلی به زبان ساده
دیکشنری مقدارها را با کلید نگه میدارد. به جای اینکه دنبال اندیس یک کالا بگردیم، نام کالا را کلید میکنیم. کلیدها یکتا هستند؛ مقداردهی دوبارهٔ یک کلید جای مقدار قبلی را میگیرد. برای موجودی باید مقدار تازه را به مقدار قبلی اضافه کنیم، نه اینکه هر سطر را روی سطر قبلی بنویسیم.
مسئلهٔ این درس
در پروژهٔ «دفتر موجودی کالا» باید یک تابع مستقل بنویسید. میزکار ورودی نمونه را در request.json قرار میدهد؛ تابع solve دیکشنری داده را میگیرد و نتیجهٔ خود را برمیگرداند. در این قرارداد input لازم نیست و خواندن تعاملی از ترمینال ممکن است اجرای ارزیابی را متوقف کند. از مثال زیر شروع کنید و پیش از اجرای آن، شکل نتیجه را حدس بزنید.
نمونهکد قابل اجرا
def solve(data):
stock = {}
for item in data['items']:
name = item['name']
stock[name] = stock.get(name, 0) + item['quantity']
return {'stock': stock, 'total': sum(stock.values())}
print(solve({'items': [{'name': 'pen', 'quantity': 2}, {'name': 'book', 'quantity': 3}, {'name': 'pen', 'quantity': 4}]}))نتیجهٔ مورد انتظار
{
"stock": {
"pen": 6,
"book": 3
},
"total": 9
}توضیح مرحلهبهمرحله
هر عضو items شامل name و quantity است. برای هر سطر، تعداد قبلی را با get میخوانیم و مقدار جدید را جمع میکنیم. تعدادها در این تمرین صحیح و غیرمنفیاند. خروجی stock نگاشت نام کالا به مجموع تعداد است و total تعداد همهٔ واحدهای کالا را نشان میدهد؛ این با تعداد نوع کالا فرق دارد.
قرارداد ورودی و خروجی
مثال فقط یک ورودی است، نه همهٔ مسئله. مقدارها را از data بخوانید و جواب نمونه را ثابت در برنامه ننویسید. نام کلیدها، نوع عدد و رشته و ترتیب فهرستها بخشی از قراردادند. در پروژه، بخش پایانی main.py نتیجهٔ تابع را در result.json ذخیره میکند؛ آن بخش را نگه دارید. موفقیت اجرای برنامه با درستبودن پاسخ و قبولی ارزیابی یکسان نیست.
خطای رایج و راه تشخیص
نوشتن stock[name] += quantity برای اولین مشاهدهٔ کالا KeyError میدهد، چون کلید هنوز وجود ندارد. از get با مقدار پیشفرض صفر استفاده کنید. نام کالا دقیق مقایسه میشود؛ «دفتر» و «دفتر بزرگ» دو نوع مستقلاند و نباید با هم یکی شوند.
تمرین مستقل و خودآزمایی
یک کالا را در سه سطر پراکنده تکرار کنید. مجموع دستی را با برنامه مقایسه کنید و توضیح دهید چرا len(stock) با sum(stock.values()) معمولاً برابر نیست.
برای هر آزمایش، ورودی، خروجی مورد انتظار و خروجی واقعی را جدا بنویسید. اگر تفاوتی دیدید، یک نمونهٔ کوچکتر بسازید و تغییر را دوباره امتحان کنید. به جای اجرای چند تغییر همزمان، هر بار یک فرض را بررسی کنید. پس از فهم نمونه، پروژهٔ مرتبط را در میزکار حل کنید؛ ارزیابی با چند ورودی متفاوت انجام میشود و پاسخ ثابت نمونه پذیرفته نخواهد شد.
گام بعدی
موضوعهای این درس: dict · get · Aggregation. اگر میتوانید دلیل هر خط را توضیح دهید و ورودی تازهای را بدون دستکاری منطق اصلی حل کنید، به مقالهٔ بعدی بروید. هدف مسیر مقدماتی، تسلط بر همین رفتارهای کوچک و قابل آزمایش است؛ برای شروع پروژههای یادگیری ماشین عجله نکنید.
منابع و مطالعهٔ بیشتر
برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.
