شمارش تکرار کلمات در پایتون

متوسطرشته

صورت سؤال

برنامه‌ای بنویسید که یک خط متن را از ورودی بخواند و برای هر کلمهٔ متفاوت، خود کلمه و تعداد تکرارش را در یک سطر به شکل word: count چاپ کند.

کلمه‌ها با فاصله از هم جدا شده‌اند. ترتیب سطرها همان ترتیبی است که هر کلمه برای اولین بار در متن آمده است.

ورودی نمونه

to be or not to be

خروجی نمونه

to: 2
be: 2
or: 1
not: 1

خودتان امتحان کنید

کد را در ویرایشگر زیر کامل کنید و اجرا کنید. ورودی نمونه در کادر ورودی آماده است و بعد از هر اجرا، خروجی شما با خروجی نمونه مقایسه می‌شود.

Ctrl + Enter
خروجی

کد را اجرا کنید تا خروجی آن اینجا نمایش داده شود.

راهنمایی

یک دیکشنری خالی بسازید و روی text.split() حلقه بزنید. متد get(word, 0) تعداد فعلی کلمه را برمی‌گرداند، یا صفر اگر کلمه هنوز در دیکشنری نباشد.

جواب و توضیح

بهتر است جواب را بعد از امتحان کردن راه خودتان باز کنید.

نمایش جواب
text = input()

counts = {}
for word in text.split():
    counts[word] = counts.get(word, 0) + 1

for word, count in counts.items():
    print(f"{word}: {count}")

این جواب چطور کار می‌کند؟

text.split() بدون آرگومان، متن را در جای هر فاصله می‌شکند و فهرستی از کلمه‌ها برمی‌گرداند. فاصله‌های پشت‌سرهم هم مشکلی درست نمی‌کنند.

counts.get(word, 0) اگر کلمه قبلاً دیده شده باشد تعدادش را برمی‌گرداند و اگر نه، صفر. با افزودن ۱ به آن، کلمهٔ تازه با تعداد ۱ وارد دیکشنری می‌شود و تعداد کلمهٔ تکراری یکی بالا می‌رود.

از پایتون 3.7 به بعد، دیکشنری ترتیب اضافه شدن کلیدها را نگه می‌دارد. برای همین حلقهٔ آخر روی counts.items() کلمه‌ها را به همان ترتیبی چاپ می‌کند که اولین بار در متن آمده‌اند.

راه دوم: collections.Counter

from collections import Counter

text = input()
counts = Counter(text.split())
for word, count in counts.items():
    print(f"{word}: {count}")

Counter همان دیکشنری شمارنده را در یک خط می‌سازد و ترتیب اولین دیده شدن را هم حفظ می‌کند. اما counts.most_common() سطرها را بر اساس تعداد از زیاد به کم مرتب می‌کند و در بیشتر متن‌ها ترتیب خروجی دیگر با ترتیب اولین دیده شدن یکی نیست.

اشتباه‌های رایج

  • counts[word] += 1 را بدون بررسی می‌نویسند و برای اولین کلمهٔ تازه خطای KeyError می‌گیرند.
  • به‌جای split() از split(" ") استفاده می‌کنند و با دو فاصلهٔ پشت‌سرهم، یک کلمهٔ خالی هم شمرده می‌شود.
  • کلمه‌ها را برای چاپ در یک set می‌ریزند و ترتیب سطرها به هم می‌ریزد.

تمرین بعدی

پایتون را قدم‌به‌قدم یاد بگیرید

این تمرین یکی از تمرین‌های پایتون با جواب دینا کد است. در دورهٔ پایتون از صفر هر مفهوم یک درس کوتاه دارد و تمرین هر درس با چند آزمون پنهان نمره می‌گیرد؛ درس‌های اول رایگان است. برای امتحان کد آزاد هم اجرای آنلاین پایتون در دسترس است.