מילונים חלק ג' – איתור ערכים

איתור ערך בתוך מילון

בפוסט הקודם הראתי איך ליצור מילונים, להכניס אליהם ערכים ולהציג את הערכים האלה. לטובת ההסברים בפוסט הזה אמשיך להשתמש באותו המילון שנראה ככה:

הראתי גם איך ניתן להציג את הנתונים במילון באמצעות המתודות keys, values, items. המתודות הללו יכולות להיות שימושיות גם כדי לעזור לנו לקבוע האם ערך מסוים קיים במילון. למשל את הערך Jerry אני יכול לחפש ככה:

אם אני מחפש מפתח אני יכול להשתמש במתודה keys או פשוט לחפש במילון עצמו (מפני שבצורה הזו פייתון גם ככה תסרוק את המפתחות בלבד)

כמו שכבר ראינו, פנייה למיקום של מפתח מסוים במילון תחזיר את הערך המשויך לאותו מפתח אך חיפוש של ערך עבור מפתח שאינו קיים יחזיר שגיאת מפתח (key Error)

כדי להימנע מהשגיאה הזאת אפשר לחפש ערך ע"י שימוש במתודה get, שפשוט מחזירה None במידה והיא לא מוצאת את הערך שצויין. כך נקבל ערך במידה ומפתח קיים, אך אם אינו קיים לא תתקבל שגיאה וריצת התכנית לא תיעצר.

כבונוס נחמד, get יכולה לקבל פרמטר נוסף שישמש כברירת מחדל למקרה שלא נמצא ערך רלוונטי.

שימוש ב-set default

המתודה setdefault היא גרסה משודרגת של get:
היא מקבלת שני פרמטרים ובודקת האם הראשון מביניהם קיים כמפתח במילון. במידה וכן – תחזיר את הערך של אותו מפתח. במידה ולא – תוסיף את אותו מפתח למילון ותכניס את הפרמטר השני שקיבלה כערך של אותו מפתח – ואז תחזיר אותו. קצת מבלבל, אני יודע. הנה דוגמה למה שקורה אם מריצים את המתודה על מפתח קיים:

המפתח Bat-man קיים במילון ולכן נקבל את הערך השייך לו:

לעומת זאת, מה יקרה אם ננסה לתת כפרמטר מפתח חדש שעדיין לא קיים במילון?

2 דברים קורים פה –

  • המפתח Walter White מתווסף למילון בצירוף הערך Jesse Pinkman
  • המשתנה sidekick מקבל את הערך מהצמד החדש שנוסף למילון.

בואו ניקח את הפעולה הזאת למקום יותר פרקטי. נניח שאנחנו רוצים לבצע בדיקת פופולריות לערכים כלשהם. זאת יכולה להיות תכנית שמטרתה למצוא את המספר הנפוץ ביותר ברשימת מספרים שעלו בהגרלה או מילה נפוצה במיוחד בתוך טקסט – לא חסרות דוגמאות. לצורך הפשטות נגיד שאנחנו רוצים לבדוק כמה פעמים כל אות מופיעה בתוך משפט מסוים. הצמדים במילון יורכבו מהאותיות (אלה יהיו המפתחות) ומספר המופעים של כל אות (אלה יהיו הערכים).
למשל מיפוי של 'Mad Max' יראה ככה:

האות M מופיעה פעמיים, האות a מופיעה פעמיים וכן הלאה. אגדיר גם שאני מעוניין במיפוי האותיות בלבד, ללא רווחים או סימנים מיוחדים (שימו לב שאין רווח במילון למרות שהוא קיים במחרוזת המקורית).

בתור התחלה נגדיר את המשפט שאותו נרצה לבדוק וגם מילון ריק שמאוחר יותר יכיל את מיפוי האותיות של אותו משפט

בשלב הבא נגדיר לולאה שתעבור על כל תו במחרוזת ותבדוק האם התו הזה הוא אות אלפביתית (בעזרת המתודה isalpha). במידה ואכן מדובר באות נשתמש ב-setdefault שתקבל את אותה אות ואת הספרה 0. לאחר מכן נקדם את הערך של אותה אות ב-1.

במידה וזוהי הפעם הראשונה שהלולאה נתקלת באות מסויימת, setdefault תייצר את המפתח במילון ותזין את הספרה 0 בתור הערך שלו. לאחר מכן נקדם את אותו ערך ב-1 כך שעכשיו אותה אות שהרגע בדקנו תכיל את המספר 1 (מה שנכון כי כרגע ראינו אותה בפעם הראשונה. בפעם הבאה שנתקל באותה אות ל-setdefault לא תהיה כל השפעה (כי המפתח כבר קיים) והדבר היחיד שיושפע הוא המונה של אותה אות ששוב יגדל ב-1. לאחר שהלולאה תסיים את פעולתה המילון יכיל את כל האותיות שהופיעו במחרוזת כמפתחות והערך של כל אות יציג את מספר הפעמים שהופיעה במשפט. מה שנשאר זה בסך הכל להדפיס את המילון

עובד יפה, אבל אם אבקש מכם לציין את 3 האותיות הנפוצות ביותר כנראה שתצטרכו לסרוק בעצמכם את כל הצמדים ולאתר אותם ידנית. אז למה לא למיין את המילון אתם שואלים? רעיון מצויין, אבל זה טיפה יותר מורכב ולכן כבר נושא לפוסט הבא