משהו לא מסתדר עם הטכניקה של comprehension בתרגיל group_by

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

נשמח לראות את השורה כדי לתת חוות דעת.
תכתבי לנו מה את מצפה לקבל ומה קורה בפועל.

מצרפת כאן את השורה של הcomprehension:


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

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

בקיצור,

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

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

לדעתי הוא לא יודע מה זה dictionary, כי תוך כדי התהליך הוא צריך ליצור אותו. תנסי לעדכן את המילון תוך כדי התהליך, ולא ליצור מילון. כלומר לעשות את התהליך כ-iterable רגיל, אבל שבתוכו מעדכן מילון. למשל:

dictionary = {}
[update_dictionary(dictionary, value) for value in values]
print(dictionary)

הפונקציה update_dictionary תקבל מילון וערך, ותעדכן בהתאם, ותחזיר מילון

לייק 1

אהבתי את הכיוון של התשובה שלך ועשיתי קצת חיפוש בנושא.
מציע לך (כותבת הפוסט) לקרוא:

לייק 1

תודה רבה לכם! אסתכל.