פרק קודם:
פייתון 9 - מילונים, טופלים וסטיםמה נלמד
- סוגים שונים של מיזוגים
- איך למזג רשימות, סטים, טופלים ומילונים
Merge - מיזוג
מיזוג מתייחס לשני רשימות שרוצים ליצור מהם רשימה אחת.
מבחינת טרמינולוגיה ניתן לקרוא לזה - Merge, Update או Join.
מיזוג רשמות מתייחס למיזוג שני משתנים שהם מייצגים ערך אחד או יותר - רשימה, סטים, מילונים וטופלים.
לא כל מיזוג מתייחס לסדר שבו הערכים מופיעים - זה אינסטינקט לנסות לתאר את הסדר שבו הערכים מופיעים לאחר המיזוג,
כאן לא נתייחס לסדר שלהם.
הוויזואליזציה הכי נפוצה לזה היא בעזרת Venn Diagram.
דיאגרמות שבנויה מעיגולים שמייצג מה משותף בין הרשימות.
מיזוג ריק - Empty Merge
שני העיגולים מייצגים את שני הרשימות שלנו.
במקרה של מיזוג ריק שום דבר לא קורה כי אנחנו לא לוקחים כלום.
מיזוג מלא - Full Merge
במיזוג מלא אנחנו לוקחים את הכל ללא תלות באם הערך מופיע פעמיים.
דוגמא:
מיזוג פנימי - Inner Merge
המיזוג הפנימי לוקח רק את כל מה שמשותף בין שני רשימות.
דוגמא:
מיזוג ימני/שמאלי - Right/Left Merge
לוקחים את כל מה שבצד מסוים ומה שמשותף בין הצד הימני לצד השמאלי
לפעמים נקרא גם מיזוג שמאלי/ימני פנימי.
דוגמא:
6 לא קיים בצד השמאלי ולכן הוא לא נכנס למיזוג.
מיזוג ימני/שמאלי חיצוני - Right/Left Outer Merge
המיזוג לוקח את הצדדים חוץ ממה שמשותף.
כאן 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
2firstStoreProducts = { "Flowers", "Toilet paper" , "Apples", "Oranges" , "Tomatoes"}
secondStoreProducts = { "Flowers", "Toilet paper", "PC Screen", "Robotic Arm","Car Engine"}
אנחנו רוצים למצוא:
- מה הם מוכרים זהה.
- מה שונה בין המוצרים.
זוהי רשימה צרה אז אין לעשות את זה ידני, תחשבו על איזה מהפונקציות להשתמש.
א.
פונקציית update מעדכנת עם רשימה אחרת את הרשימה המקורית.
פונקציית union ממזגת את הרשימות ומחזירה רשימה חדשה.
ב.
Left Merge הוא יכול להיקרא גם Lerfe Inner Merge,
ז”א הוא לוקח את מה שמשותף גם בין הרשימות.
כאשר מיזוג חיצוני לא לוקח את מה שמשותף, אלה רק מה ששונה בין שניהם.
ג.
חנות שמוכרת מוצרים ורוצה לעדכן את רשימת המוצרים שלה במוצרים חדשים.
משחק מחשב שמעדכן רשימת אפקטים.
אנליסט שמבצע חקר על נתונים.
עיבוד תמונה שמעבדת שתי תמונות - מה שיפה בדוגמא הזו, שההבנה שגם תמונה זה בעצם רשימה של פיקסלים וניתן לעבד אותם כמו רשימות אחרות.
1 |
|
ברמה הלוגית הקוד לא מסובך - מבצעים איטרציה על המילון ומכניסים למילון חדש את כל הערכים שלא נמצאים במילון השני.
במידה והוא נמצא לא מכניסים.
וככה מבצעים גם המילון השני מול המילון הראשון ומכניסים את כל הערכים שלא נמצאים במילון הראשון.
התנאי יכול להיות מבלבל לאנשים שלא מכירים תנאים מספיק -
אז התנאי יתקיים כאשר המפתח לא נמצא במילון השני.
1 | firstStoreProducts = { "Flowers", "Toilet paper" , "Apples", "Oranges" , "Tomatoes"} |
intersection מבצע מיזוג פנימי.
difference מבצע מיזוג חיצוני לצד אחד!
אם אנחנו רוצים את שני הצדדים אז ניתן להשתמש ב- symmetric_difference.
בפרק הבא נרחיב את הידע על אובייקטי רשימות נוספות!
פייתון 10.2 - אובייקטי רשימות ויכולות