מילונים וקבוצות (Dictionaries and Sets)

מילונים (Dictionaries) וקבוצות (Sets) הם מבני נתונים שימושיים בפייתון:

  1. מילונים (Dictionaries):
    • מבנה נתונים שמחזיק זוגות של מפתח וערך (Key-Value).
    • מאפשר אחסון נתונים בצורה מאורגנת, עם גישה מהירה לפי מפתח.
  2. קבוצות (Sets):
    • מבנה נתונים שמחזיק רק ערכים ייחודיים.
    • לא מסודר (אין סדר לערכים) ומאפשר פעולות מתמטיות כמו איחוד, חיתוך והפרש.

דוגמת קוד

# Creating and accessing a dictionary
quiz_data = {
    "Question 1": "What is 2 + 2?",
    "Question 2": "What is the capital of France?",
    "Question 3": "What is 5 * 6?"
}

print("Dictionary Example:")
print("Question 1:", quiz_data["Question 1"])  # Accessing by key

quiz_data["Question 4"] = "What is the square root of 16?"  # Adding a new key-value pair
print("After adding a question:", quiz_data)

del quiz_data["Question 2"]  # Removing a key-value pair
print("After deleting a question:", quiz_data)

# Creating and modifying a set
player_set = {"Alice", "Bob", "Charlie"}  # Creating a set
print("\nSet Example:")
print("Original set:", player_set)

player_set.add("David")  # Adding an element
print("After adding a player:", player_set)

player_set.remove("Charlie")  # Removing an element
print("After removing a player:", player_set)

הסבר על הקוד

מילונים:

  1. השורה quiz_data = {...} יוצרת מילון שמכיל זוגות מפתח-ערך.
    • המפתחות (Keys) הם שאלות, והערכים (Values) הם התשובות.
  2. גישה לפריט במילון נעשית לפי המפתח, לדוגמה quiz_data["Question 1"] ולא על פי מקום סידורי כמו שראינו ברשימות.
  3. הוספת פריט חדש מתבצעת על ידי הצבת מפתח חדש עם ערך, לדוגמה quiz_data["Question 4"] = "...".
  4. הסרת פריט מתבצעת עם del, לדוגמה del quiz_data["Question 2"].

קבוצות:

  1. השורה player_set = {...} יוצרת קבוצה עם ערכים ייחודיים.
  2. הוספת פריט מתבצעת עם add, לדוגמה player_set.add("David").
  3. הסרת פריט מתבצעת עם remove, לדוגמה player_set.remove("Charlie").

תרגילים

תרגיל 1:
צרו מילון שמכיל שלושה מפתחות: שמות של מדינות, ושלושה ערכים: ערי הבירה שלהן. הדפיסו את ערך הבירה של אחת המדינות.

תרגיל 2:
כתבו תוכנית שמוסיפה מפתח וערך חדש למילון קיים ומדפיסה את המילון המעודכן.

תרגיל 3:
צרו קבוצה עם שמות של שלושה אנשים. הוסיפו שם חדש והסירו שם קיים, ואז הדפיסו את הקבוצה המעודכנת.

תרגיל 4:
בדקו אם שם מסוים נמצא בקבוצה על ידי שימוש ב-in.

תרגיל 5:
אתגר: צרו שתי קבוצות עם שמות שונים של אנשים ובצעו פעולת איחוד (union) וחיתוך (intersection) ביניהן.

הפרויקט הגדול: משחק הטריוויה

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

# Global data structures
questions = {
    "What is 2 + 2?": 4,
    "What is the capital of France?": "Paris",
    "What is 5 * 6?": 30
}
players = set()  # Set to track player names

# Function to welcome the player and handle admin or regular user flow
def welcome():
    """Welcome the player and check if they are admin."""
    print("Welcome to the Quiz Game!")
    name = input("What is your name? ")
    players.add(name)  # Add the player to the set of players
    
    if name.lower() == "admin":
        print("Hello, Admin! You can manage the quiz.")
        manage_quiz()
    else:
        print(f"Hello, {name}, let's start the game!")
        play_quiz(name)

# Function to add or remove questions
def manage_quiz():
    """Allow the admin to add or remove questions."""
    global questions  # Use the global dictionary
    
    while True:
        action = input("Do you want to 'add', 'remove', or 'done'? ").lower()
        if action == "done":
            break
        elif action == "add":
            new_question = input("Enter a new question: ")
            new_answer = input("Enter the correct answer: ")
            questions[new_question] = new_answer  # Add to the dictionary
            print("Question added!")
        elif action == "remove":
            question_to_remove = input("Enter the question to remove: ")
            if question_to_remove in questions:
                del questions[question_to_remove]  # Remove from the dictionary
                print("Question removed!")
            else:
                print("Question not found.")
        else:
            print("Invalid option. Try again.")

    print("\nUpdated questions:", questions)
    play_now = input("Do you want to play the game now? (yes/no): ").lower()
    if play_now == "yes":
        play_quiz("Admin")

# Function to play the quiz
def play_quiz(name="Player"):
    """Play the quiz game using the global questions dictionary."""
    global questions  # Use the global dictionary
    score = 0  # Initialize score

    # Loop through the questions
    for question, correct_answer in questions.items():
        print("\n" + question)
        user_answer = input("Your answer: ")

        if str(user_answer).lower() == str(correct_answer).lower():
            print("Correct!")
            score += 1
        else:
            print("Wrong! The correct answer was:", correct_answer)

    print("\nGame over!")
    print(name, "your final score is:", score)
    print("Players who have played:", players)

# Start the program
welcome()

שיפורים שנוספו:

  1. שימוש במילון לשאלות:
    • השאלות והתשובות נשמרות במבנה מילון, מה שמאפשר גישה ישירה ומהירה לפי השאלה.
  2. שימוש בקבוצה לעקוב אחרי שחקנים:
    • שמות השחקנים נשמרים בקבוצה players, שמוודאת שאין שמות כפולים.
  3. ניהול שאלות על ידי המנהל:
    • המנהל יכול להוסיף ולהסיר שאלות בקלות דרך המילון.
  4. משחק עם כל השחקנים:
    • רשימת השאלות המעודכנת נשמרת ומשמשת את כל השחקנים, כולל המנהל.