Tuples & Dictionaries in Python

Part 1 — Tuples

What is a Tuple?

A tuple is exactly like a list — it stores multiple values. But with one big difference:

Lists are mutable — you can change them after creation Tuples are immutable — once created, you cannot change them

# List — can be changed
fruits_list = ["apple", "banana", "mango"]

# Tuple — cannot be changed
fruits_tuple = ("apple", "banana", "mango")

Only difference in syntax — list uses [], tuple uses ().


Creating a Tuple

coordinates = (28.6, 77.2)           # latitude, longitude
rgb = (255, 0, 128)                  # color values
days = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
person = ("Gagan", 22, "Delhi")      # mixed types

# Single item tuple — needs a trailing comma
single = (42,)        # this is a tuple
not_tuple = (42)      # this is just a number in brackets — NOT a tuple

Accessing Items — Same as List

person = ("Gagan", 22, "Delhi")

print(person[0])     # Gagan
print(person[1])     # 22
print(person[-1])    # Delhi — negative indexing works too

Slicing works too:

days = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")

print(days[0:5])     # ('Mon', 'Tue', 'Wed', 'Thu', 'Fri')
print(days[-2:])     # ('Sat', 'Sun')

Tuples are Immutable — Cannot Change

colors = ("red", "green", "blue")

colors[0] = "yellow"    # ERROR! TypeError: tuple does not support item assignment

Once a tuple is created, its values are locked. No adding, removing, or changing.


Why Use Tuple If You Can't Change It?

Great question. Here's why tuples exist:

1. Safety — When data should never change, use a tuple. Like days of the week, months of the year, coordinates of a fixed location. Using a tuple signals to anyone reading your code "this data is not supposed to change."

2. Speed — Tuples are slightly faster than lists because Python knows they won't change.

3. Dictionary keys — Tuples can be used as dictionary keys, lists cannot. (We'll see this soon.)

Real world examples of tuple data:

months = ("Jan", "Feb", "Mar", "Apr", "May", "Jun",
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

directions = ("North", "South", "East", "West")

status_codes = (200, 301, 404, 500)

These values will never change — tuple is perfect.


Tuple Methods

Tuples have only 2 methods (because you can't modify them):

numbers = (1, 2, 3, 2, 4, 2, 5)

print(numbers.count(2))      # 3 — how many times 2 appears
print(numbers.index(4))      # 4 — index of value 4
print(len(numbers))          # 7 — total items

Tuple Unpacking — Very Useful

You can unpack tuple values directly into variables:

person = ("Gagan", 22, "Delhi")

name, age, city = person       # unpacking

print(name)    # Gagan
print(age)     # 22
print(city)    # Delhi

This works with lists too. You've seen a version of this before with enumerate().


Looping Through Tuple

days = ("Mon", "Tue", "Wed", "Thu", "Fri")

for day in days:
    print(day)

Exactly same as looping through a list.


Part 2 — Dictionaries

What is a Dictionary?

A list stores items by index number — 0, 1, 2, 3...

A dictionary stores items by custom keys — like a real dictionary where you look up words.

# List — access by number
person_list = ["Gagan", 22, "Delhi"]
print(person_list[0])    # Gagan — but what does index 0 mean?

# Dictionary — access by name
person_dict = {"name": "Gagan", "age": 22, "city": "Delhi"}
print(person_dict["name"])    # Gagan — clear and readable!

Dictionary is made of key-value pairs:

  • "name" is the key
  • "Gagan" is the value

Creating a Dictionary

student = {
    "name": "Gagan",
    "age": 22,
    "city": "Delhi",
    "is_student": True,
    "marks": 88.5
}

print(student)

Output:

{'name': 'Gagan', 'age': 22, 'city': 'Delhi', 'is_student': True, 'marks': 88.5}

Accessing Values

student = {
    "name": "Gagan",
    "age": 22,
    "city": "Delhi"
}

print(student["name"])     # Gagan
print(student["age"])      # 22
print(student["city"])     # Delhi

If key doesn't exist — you get a KeyError:

print(student["phone"])    # KeyError: 'phone'

Safe way using .get() — returns None instead of error:

print(student.get("phone"))           # None — no error
print(student.get("phone", "N/A"))    # N/A — custom default value

Always prefer .get() when you're not sure if the key exists.


Adding and Updating Values

student = {"name": "Gagan", "age": 22}

# Adding new key
student["city"] = "Delhi"
student["marks"] = 88.5

# Updating existing key
student["age"] = 23

print(student)

Output:

{'name': 'Gagan', 'age': 23, 'city': 'Delhi', 'marks': 88.5}

Removing Items

student = {"name": "Gagan", "age": 22, "city": "Delhi", "marks": 88.5}

del student["marks"]              # delete by key
print(student)

removed = student.pop("city")     # remove and return value
print(removed)                    # Delhi
print(student)

Output:

{'name': 'Gagan', 'age': 22, 'city': 'Delhi'}
Delhi
{'name': 'Gagan', 'age': 22}

Dictionary Methods

student = {"name": "Gagan", "age": 22, "city": "Delhi"}

print(student.keys())      # dict_keys(['name', 'age', 'city'])
print(student.values())    # dict_values(['Gagan', 22, 'Delhi'])
print(student.items())     # dict_items([('name', 'Gagan'), ('age', 22), ('city', 'Delhi')])

print(len(student))        # 3 — number of key-value pairs
print("name" in student)   # True — check if key exists

Looping Through a Dictionary

student = {"name": "Gagan", "age": 22, "city": "Delhi"}

# Loop through keys only
for key in student:
    print(key)

# Loop through keys and values together — most common
for key, value in student.items():
    print(f"{key}: {value}")

Output:

name: Gagan
age: 22
city: Delhi

Dictionary Inside a List — Very Common Pattern

This is how real-world data looks — a list of dictionaries:

students = [
    {"name": "Rahul", "age": 20, "marks": 85},
    {"name": "Priya", "age": 21, "marks": 92},
    {"name": "Gagan", "age": 22, "marks": 78}
]

# Access individual student
print(students[0]["name"])     # Rahul
print(students[1]["marks"])    # 92

# Loop through all students
for student in students:
    print(f"Name: {student['name']}, Marks: {student['marks']}")

Output:

Name: Rahul, Marks: 85
Name: Priya, Marks: 92
Name: Gagan, Marks: 78

This pattern is everywhere in real apps — when you fetch data from a database or API, it usually comes back in this format.


Nested Dictionary — Dictionary Inside Dictionary

company = {
    "name": "TechCorp",
    "location": "Delhi",
    "ceo": {
        "name": "Amit Shah",
        "age": 45,
        "email": "amit@techcorp.com"
    }
}

print(company["name"])                    # TechCorp
print(company["ceo"]["name"])             # Amit Shah
print(company["ceo"]["email"])            # amit@techcorp.com

Real World Example — Contact Book

contacts = {}

def add_contact():
    name = input("Enter name: ")
    phone = input("Enter phone: ")
    email = input("Enter email: ")
    contacts[name] = {"phone": phone, "email": email}
    print(f"{name} added to contacts!")

def view_contacts():
    if len(contacts) == 0:
        print("No contacts saved")
    else:
        print("\n=== All Contacts ===")
        for name, info in contacts.items():
            print(f"Name: {name}")
            print(f"  Phone: {info['phone']}")
            print(f"  Email: {info['email']}")
            print()

def search_contact():
    name = input("Enter name to search: ")
    if name in contacts:
        info = contacts[name]
        print(f"\nName: {name}")
        print(f"Phone: {info['phone']}")
        print(f"Email: {info['email']}")
    else:
        print("Contact not found")

def delete_contact():
    name = input("Enter name to delete: ")
    if name in contacts:
        del contacts[name]
        print(f"{name} deleted!")
    else:
        print("Contact not found")

while True:
    print("\n=== Contact Book ===")
    print("1. Add contact")
    print("2. View all contacts")
    print("3. Search contact")
    print("4. Delete contact")
    print("5. Exit")

    choice = input("Enter choice: ")

    if choice == "1":
        add_contact()
    elif choice == "2":
        view_contacts()
    elif choice == "3":
        search_contact()
    elif choice == "4":
        delete_contact()
    elif choice == "5":
        print("Goodbye!")
        break
    else:
        print("Invalid choice")

This is a proper mini application — using dictionaries, lists, functions, loops, and conditions all together.


List vs Tuple vs Dictionary — When to Use What

List Tuple Dictionary
Syntax [] () {}
Can change? Yes No Yes
Access by Index number Index number Key name
Use when Order matters, data changes Data is fixed Key-value pairs, lookup by name
Example Shopping cart, student marks Coordinates, RGB colors, months User profile, contact info

Exercise 🏋️

Build a Simple Inventory System:

  1. Start with this inventory already in a dictionary:
inventory = {
    "apple": {"price": 20, "quantity": 50},
    "banana": {"price": 10, "quantity": 100},
    "mango": {"price": 40, "quantity": 30}
}
  1. Build a menu with these options:
    • View all items (show name, price, quantity)
    • Add new item (ask name, price, quantity)
    • Update quantity of existing item
    • Remove item
    • Exit

Expected view output:

=== Inventory ===
apple  - Price: Rs.20, Quantity: 50
banana - Price: Rs.10, Quantity: 100
mango  - Price: Rs.40, Quantity: 30

This exercise combines lists, dictionaries, functions, loops, and conditions — basically everything from Stage 1 to Stage 4!


No comments:

Post a Comment

Tuples & Dictionaries in Python

Part 1 — Tuples What is a Tuple? A tuple is exactly like a list — it stores multiple values. But with one big difference: Lists are mutab...