מחברת 5 - תרגול סידור רשימות - שאלה

שלום,
במחברת 5, אחרי שלומדים על סידור רשימות באמצעות sorted, ועל reverse ו-key, יש תירגול. בתירגול מבקשים לסדר רשימה של שמות, כשהשמות יכולים להכיל גם אותיות גדולות וגם אותיות קטנות.

אני יודע איך לפתור את זה, אבל האם הייתי אמור לפתור את זה באמצעות משהו שבדיוק נלמד? כי לא הבנתי איך אני יכול להשתמש ב-key כלשהו בשביל לפתור את זה. הרי lower/upper הן פעולות על מחרוזות, ולא פונקציות כמו len, שבה נעשה שימוש בדוגמה.
אשמח להבהרה מהסגל או מישהו שהצליח לפתור את זה באמצעות החומר החדש

תודה.

להשתמש ב-key עם פונקציה מתאימה במקום עם מתודה :slight_smile:

זאת פונקציה שלמדנו?

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

אז הכוונה היא שאפשר להשתמש ב-key עם פונקציה שאנחנו יוצרים.
הבנתי את מהמשך המחברת.

תודה לעונים.

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

סורטד עוברת איבר איבר ומחליטה איפה למקם אותו ביחס לפרמטר מסויים.
למשל: אם הייתה לי כתה של תלמידים, והייתי מפעיל עליהם sorted עם key שמפנה לפונקציה שמחזירה את שנת הלידה שלהם,
אז sorted הייתה עוברת תלמיד תלמיד, מפנה אותו לפונקציה שבודקת מה שנת הלידה של אותו תלמיד (כלומר עבור פרט אחד בלבד מכל הכתה) והייתה מקבלת חזרה את שנת הלידה שלו.
אחרי שהיא הייתה עוברת על כל התלמידים ומקבלת מכולם את הנתונים של שנות הלידה היא תמיין את כל התלמידים בהתאם לנתונים של שנות הלידה.

הפוקנציה שמכניסים לkey היא בעצם אומרת לsorted שעבור כל איבר שהיא בודקת, הפרמטר למיון יהיה לפי התוצאה שחוזרת מהפונקציה. כך שאם הפונקציה שלנו קיבלה תלמיד והחזירה שנת לידה, אז sorted תחפש לפי שנות הלידה שהיא מקבלת מכל התלמידים שהיא “עוברת” עליהם.

יש לשים לב שסורטד מקבל משתנה iterable - כלומר היא בעצמה כבר עובדת איבר איבר ולא צריך להפעיל עליה עוד מעבר בין האיברי.

נחזור לדוגמא שלנו:

def get_birth(person):
    return person[1]

students = [('Aviad',1988), ('Sapir',1990),('Shani',1986)] 
print(sorted(students, key=get_birth))

פלט:

[('Shani', 1986), ('Aviad', 1988), ('Sapir', 1990)]
2 לייקים

שימי לב שלא צריך לקרוא לפונקציה בתוך ה־key, אלא להעביר את הפונקציה עצמה (בלי פתח וסגור סוגריים אחרי השם שלה)

לייק 1

תודה @aviadamar @Yam,
גם סיבכתי מדי את הפונקציה שפועלת על כל איבר ברשימה, וגם לא העברתי אותה נכון.

לייק 1

קורה. בשביל זה יש פורום :slight_smile:

2 לייקים

שאלה נוספת: האם צריך לקבל חזרה את הרשימה עם השמות המקוריים?
כי אני מקבל חזרה את השמות אחרי lower ולא מצליח לייצר פונקציה שתחזיר לי חזרה את השמות כפי שנכתבו במקור.

צריך את השמות המקוריים. נסה לחשוב איך להשתמש ב-key כדי למיין בלי לשנות את השמות המקוריים :slightly_smiling_face:

לייק 1