מילון הוא טבלת חיפוש
רשימות מאונדקסות לפי מיקום. מילונים מאונדקסים לפי מפתח, בדרך כלל מחרוזת או מספר, וכל מפתח ממופה לערך. השינוי האחד הזה פותח קטגוריה ענקית של תוכניות: מלאי, הגדרות, מטעני JSON, פרופילי משתמשים, מטמונים.
המפתחות והערכים יכולים להיות כמעט כל דבר. מפתחות צריכים להיות hashable (כלומר: מספרים, מחרוזות, tuples; לא רשימות ולא dicts אחרים). על ערכים אין שום הגבלה: dict יכול להכיל כל דבר, כולל dicts או רשימות אחרים.
יצירת מילונים
יש כמה דרכים, ולכל אחת המקום שלה:
קריאת ערכים
שתי דרכים, והבחירה ביניהן חשובה:
בחרו לפי הכוונה:
- השתמשו ב-
[]כשהמפתח חייב להיות שם. אם הוא לא שם, זה באג ואתם רוצים שגיאה רועשת. - השתמשו ב-
.get()כש"לא קיים" הוא מקרה תקין. זה מאפשר לכתוב ברירות מחדל בלי try/except.
הוספה, עדכון ומחיקה
הצבה למפתח יוצרת אותו או מעדכנת אותו:
update() ממזגת dict אחר או אוסף של זוגות:
מפתחות משותפים ב-overrides דורסים את אלה שב-settings.
בדיקה אם מפתח קיים
in בודק את המפתחות, לא את הערכים:
כדי לבדוק דווקא ערכים, השתמשו ב-user.values():
איך עוברים על מילון בלולאה
יש שלוש תצוגות שאפשר לעבור עליהן בלולאה:
.items() היא מה שתשתמשו בו רוב הזמן: היא נותנת את הזוג, כבר מפורק ומוכן לשימוש.
סדר המעבר ב-Python מודרנית (3.7 ומעלה) תואם לסדר ההכנסה. dict הוא לא "שק קסמים": אם מוסיפים a, אחר כך b ואחר כך c, המעבר מחזיר אותם בסדר הזה. זו הבטחה של השפה שאפשר לסמוך עליה.
איך ממיינים מילון
מילונים שומרים על סדר ההכנסה, ולכן "מיון" של dict פירושו בעצם בניית dict חדש שהמפתחות שלו מוכנסים בסדר שאתם רוצים:
sorted() מחזירה רשימה של זוגות; עטיפה שלה ב-dict(...) בונה מחדש מילון בסדר החדש. אם צריך רק את הזוגות הממוינים (ולא dict), וותרו על הקריאה החיצונית ל-dict().
איך ממזגים שני מילונים
Python 3.9 ומעלה נותנת את האופרטור |:
כשיש התנגשות מפתחות, הערכים מה-dict השני (זה שאחרי ה-|) מנצחים. .update() היא המקבילה שמשנה במקום. בגרסאות Python ישנות יותר, השתמשו ב-{**defaults, **overrides}.
הדפוס setdefault
צורך נפוץ: "אם המפתח קיים, השתמשו בערך שלו; אם לא, הגדירו ברירת מחדל ואז השתמשו בה".
או, עדיף, השתמשו ב-collections.Counter:
Counter היא תת-מחלקה של dict שסופרת כברירת מחדל. זו הבחירה הנכונה בכל פעם שסופרים מופעים.
Dictionary Comprehensions
מקבילות ל-list comprehensions, אבל לבניית dicts:
אותם כללים כמו list comprehensions, אבל עם key: value בין הסוגריים המסולסלים.
dict כתאום של JSON
dicts של Python מתאימים כמעט בדיוק לאובייקטים של JSON. המרה ביניהם היא קריאה אחת:
זו הסיבה ש-dicts מופיעים בכל מקום בעבודת ווב: בקשות ותשובות API הן בעצם מניפולציה של dicts עם קצת רשת באמצע.
דוגמה מעשית
תוכנית קטנה בסגנון קובץ הגדרות שעוקבת אחרי פרופיל משתמש:
dicts מקוננים, ערכים שניתנים לשינוי, .get() עם ברירת מחדל: ארגז הכלים הבסיסי לכל נתונים בצורת רשומה.
ממשיכים הלאה
רשימות, tuples, קבוצות ומילונים. עם ארבעת האוספים האלה ביד, אפשר למדל כמעט כל נתון שתפגשו בשלבים הראשונים. בהמשך נלמד על list comprehension: הדרך התמציתית של Python להפוך אוסף אחד לאחר.
שאלות נפוצות
מה זה מילון ב-Python?
מילון הוא אוסף של זוגות מפתח-ערך. מחפשים ערך לפי המפתח שלו: prices['apple'] במקום prices[0]. מילונים מהירים לקריאה ולכתיבה, המפתחות חייבים להיות ייחודיים, וב-Python מודרנית הם שומרים על סדר ההכנסה של הפריטים.
איך מוסיפים מפתח למילון ב-Python?
מציבים אליו ערך: my_dict['new_key'] = 'new value'. אם המפתח כבר קיים, הערך נדרס. אם לא, הוא מתווסף. אין הבדל בין "הכנסה" ל"עדכון": זה אותו תחביר.
מה ההבדל בין dict[key] ל-dict.get(key)?
dict[key] זורקת KeyError אם המפתח לא קיים. dict.get(key) מחזירה במקום זאת None (או ברירת מחדל שאתם מספקים). השתמשו ב-.get() כשמפתחות חסרים הם צפויים ונורמליים; השתמשו ב-[key] כשמפתח חסר הוא באג.