פרק קודם:
פייתון 9 - מילונים, טופלים וסטיםמיזוג מתייחס לשני רשימות שרוצים ליצור מהם רשימה אחת.
מבחינת טרמינולוגיה ניתן לקרוא לזה - Merge, Update או Join.
מיזוג רשמות מתייחס למיזוג שני משתנים שהם מייצגים ערך אחד או יותר - רשימה, סטים, מילונים וטופלים.
לא כל מיזוג מתייחס לסדר שבו הערכים מופיעים - זה אינסטינקט לנסות לתאר את הסדר שבו הערכים מופיעים לאחר המיזוג,
כאן לא נתייחס לסדר שלהם.
הוויזואליזציה הכי נפוצה לזה היא בעזרת Venn Diagram.
דיאגרמות שבנויה מעיגולים שמייצג מה משותף בין הרשימות.
שני העיגולים מייצגים את שני הרשימות שלנו.
במקרה של מיזוג ריק שום דבר לא קורה כי אנחנו לא לוקחים כלום.
במיזוג מלא אנחנו לוקחים את הכל ללא תלות באם הערך מופיע פעמיים.
דוגמא:
המיזוג הפנימי לוקח רק את כל מה שמשותף בין שני רשימות.
דוגמא:
לוקחים את כל מה שבצד מסוים ומה שמשותף בין הצד הימני לצד השמאלי
לפעמים נקרא גם מיזוג שמאלי/ימני פנימי.
דוגמא:
6 לא קיים בצד השמאלי ולכן הוא לא נכנס למיזוג.
המיזוג לוקח את הצדדים חוץ ממה שמשותף.
כאן 1 ו6 לא נכנסים למיזוג.
לבצע מיזוג מלא בין רשימות נתמך בפייתון בעזרת + או פונקציה extend
.
שימוש ב+ ייצור לנו רשימה חדש.
הפונקציה extend
תוסיף ערכים לרשימה קיימת.
1 | myList = [1,2,3] |
טופל לא יכול להשנות לכן אין לנו פונקציה extend
.
אבל ניתן לחבר טופלים ואפילו להכפיל!
1 | cars = ("Suzuki", "Toyota") |
מילונים ניתן גם לחבר בעזרת הפונקציה update
.
בפייתון 3.9 ניתן גם להשתמש באופרטור |
.
1 | dic = { 1: "One", 2:"Two" } |
1 | dic = { 1: "One", 2:"Two" } |
לכל המיזוגים יש שני פונקציות, פונקציה אחת שמעדכנת ואחת שמחזירה סט חדש.
פונקציות ה-update
מעדכנות את הסט.
והפונקצייה השנייה מחזירה סט חדש.
זוכרים שדיברנו על const ו Immutable?
העקרון שמחזירים ערך חדש הוא עקרון חשוב ואני אישית מעדיף להשתמש בפונקציות שמחזירות ערך חדש מאשר לעדכן ערך קיים.
תנסו לבדוק מה יודפס אחרי כל מיזוג לפני שאתם מריצים את הקוד!
update
- מעדכן סט קייםunion
- מחזיר סט חדש.
1 | myList = {1,2,3} |
intersection_update
- מעדכן סט קייםintersection
- מחזיר סט חדש
1 | myList = {1,2,3} |
symmetric_difference_update
symmetric_difference
1 | myList = {1, 2, 3} |
א.
מה ההבדל בין update ו union?
ב.
מה ההבדל בין Left Merge ל-Left Outter Merge?
ג.
תנו כמה דוגמאות ללמה נרצה למזג רשימות.
בין הדוגמאות תנסו לחשוב על מקרים טכניים שבהם מערכת או קוד יירצו לבצע מיזוג רשימות.
מה הכוונה למקרה טכני?
כאשר הצורך לא בא מצורך של בן אדם לרשימות האלו, אלה הקוד/המחשב יירצה לבצע את זה עבור עיבוד נתונים פנימי.
תממשו מיזוג חיצוני למילון ע”פ המפתחות שלו.
ע”פ העקרון שלמדנו - תחזירו מילון חדש.
אחרי שסקרנו שני חנויות הוצאנו רשימות מוצרים של שניהם:
1 | firstStoreProducts = { "Flowers", "Toilet paper" , "Apples", "Oranges" , "Tomatoes"} |
אנחנו רוצים למצוא:
- מה הם מוכרים זהה.
- מה שונה בין המוצרים.
זוהי רשימה צרה אז אין לעשות את זה ידני, תחשבו על איזה מהפונקציות להשתמש.
א.
פונקציית update מעדכנת עם רשימה אחרת את הרשימה המקורית.
פונקציית union ממזגת את הרשימות ומחזירה רשימה חדשה.
ב.
Left Merge הוא יכול להיקרא גם Lerfe Inner Merge,
ז”א הוא לוקח את מה שמשותף גם בין הרשימות.
כאשר מיזוג חיצוני לא לוקח את מה שמשותף, אלה רק מה ששונה בין שניהם.
ג.
חנות שמוכרת מוצרים ורוצה לעדכן את רשימת המוצרים שלה במוצרים חדשים.
משחק מחשב שמעדכן רשימת אפקטים.
אנליסט שמבצע חקר על נתונים.
עיבוד תמונה שמעבדת שתי תמונות - מה שיפה בדוגמא הזו, שההבנה שגם תמונה זה בעצם רשימה של פיקסלים וניתן לעבד אותם כמו רשימות אחרות.
1 |
|
ברמה הלוגית הקוד לא מסובך - מבצעים איטרציה על המילון ומכניסים למילון חדש את כל הערכים שלא נמצאים במילון השני.
במידה והוא נמצא לא מכניסים.
וככה מבצעים גם המילון השני מול המילון הראשון ומכניסים את כל הערכים שלא נמצאים במילון הראשון.
התנאי יכול להיות מבלבל לאנשים שלא מכירים תנאים מספיק -
אז התנאי יתקיים כאשר המפתח לא נמצא במילון השני.
1 | firstStoreProducts = { "Flowers", "Toilet paper" , "Apples", "Oranges" , "Tomatoes"} |
intersection מבצע מיזוג פנימי.
difference מבצע מיזוג חיצוני לצד אחד!
אם אנחנו רוצים את שני הצדדים אז ניתן להשתמש ב- symmetric_difference.
בפרק הבא נרחיב את הידע על אובייקטי רשימות נוספות!
פייתון 10.2 - אובייקטי רשימות ויכולות