Bài 5: Dữ liệu Tập hợp – List

5.1. Khái niệm List & Truy cập Dữ liệu

5.1.1. Khái niệm List: “Chiếc Thùng” chứa nhiều thứ

  • Vấn đề: Nếu muốn lưu trữ 100 địa chỉ IP, việc tạo 100 biến (ip1, ip2, …) là không khả thi.

Ví dụ : Kệ Đựng Thiết bị 🖥️

Hãy tưởng tượng List giống như một Kệ đựng đồ trong phòng máy chủ.

Khái niệm ListẨn dụ Kệ đựng Thiết bịMô tả
List (danh_sách)Chiếc kệ Rack Server (Kệ tổng thể)Là nơi lưu trữ tất cả các vật phẩm.
Phần tửMột thiết bị cụ thể (Switch, Router, Server)Là một đối tượng được lưu trữ trên kệ.
Chỉ mục (Index)Vị trí của thiết bị trên kệ (đếm từ 0)Vị trí 0 là thiết bị ở tầng thấp nhất. Vị trí 1 là thiết bị ở tầng thứ hai, v.v.
  • Khái niệm: List (Danh sách) là một loại tập hợp dùng để lưu trữ nhiều giá trị (có thể cùng hoặc khác kiểu dữ liệu) dưới một tên biến duy nhất.

  • Cú pháp: List được tạo ra bằng cách đặt các giá trị bên trong dấu ngoặc vuông [], cách nhau bởi dấu phẩy.

    # Ví dụ 1: Danh sách các server
    danh_sach_server = ["Web-01", "DB-01", "Router-A"]
    
    # Ví dụ 2: List chứa nhiều loại dữ liệu
    thong_tin = ["PC01", 8, 450.5, True] 
    

Kết luận

List là một công cụ cực kỳ quan trọng vì nó cho phép chúng ta làm việc với hàng loạt dữ liệu một cách có tổ chức, thay vì phải khai báo từng biến riêng lẻ. Trong lập trình, List là nền tảng để xử lý các tập tin, database hay bất kỳ tập hợp thông tin nào.

5.1.2. Truy cập Index và Cắt List (Slicing) 

  • Chỉ mục (Index): Mỗi phần tử trong List có một vị trí duy nhất, gọi là chỉ mục, bắt đầu từ 0.

    • Phần tử đầu tiên có Index là [0].

    • Phần tử cuối cùng có Index là [-1] (dùng số âm để đếm ngược từ cuối).

  • Cú pháp truy cập: Dùng tên biến List kèm chỉ mục trong ngoặc vuông.

    danh_sach_server = ["Web-01", "DB-01", "Router-A"]
    
    print(danh_sach_server[0])   # Kết quả: Web-01
    print(danh_sach_server[-1])  # Kết quả: Router-A
    
    # Thay đổi giá trị của một phần tử
    danh_sach_server[2] = "Router-B" 
    
  • Cắt List (Slicing): Giống như cắt chuỗi, dùng dấu hai chấm : để lấy ra một phần của List.

    print(danh_sach_server[0:2]) # Kết quả: ["Web-01", "DB-01"]

5.2. Thao tác Cơ bản: Thêm, Xóa, Duyệt

5.2.1. Thêm phần tử ()

  • : Thêm phần tử vào cuối List. Đây là cách thêm phổ biến nhất.

    danh_sach = ["A", "B"]
    danh_sach.append("C") # Kết quả: ["A", "B", "C"]
    
  • : Thêm phần tử vào một vị trí cụ thể trong List.

    danh_sach.insert(1, "X") # Thêm "X" vào vị trí Index 1
    # Kết quả: ["A", "X", "B", "C"]
    

5.2.2. Xóa phần tử ()

  • : Xóa phần tử tại vị trí Index và trả về giá trị của phần tử đó (rất hữu ích). Nếu không truyền Index, nó xóa phần tử cuối cùng.

    server_bi_xoa = danh_sach.pop(2) # Xóa "B" (ở Index 2 sau khi insert)
    # List: ["A", "X", "C"]
    # server_bi_xoa: "B" 
    
  • : Xóa phần tử đầu tiên có giá trị tương ứng được tìm thấy trong List.

    danh_sach.remove("A") # Xóa "A"
    # List: ["X", "C"]
    

5.2.3. Duyệt List bằng

  • Mục đích: Để thực hiện một hành động (ví dụ: in, kiểm tra) trên tất cả các phần tử trong List.

    danh_sach_ip = ["192.168.1.1", "10.0.0.1", "172.16.1.1"]
    
    # Python tự động gán từng phần tử cho biến ip
    for ip in danh_sach_ip:
        print(f"Đang kiểm tra địa chỉ IP: {ip}")

5.3. Ứng dụng Quản lý Danh sách

5.3.1. Tích hợp để Tìm kiếm

  • Tình huống: Kiểm tra xem một thiết bị có tồn tại trong danh sách không.

    # Tìm kiếm
    ten_thiet_bi_can_tim = input("Nhập tên thiết bị cần tìm: ")
    
    if ten_thiet_bi_can_tim in danh_sach_server:
        print("=> Thiết bị đã tồn tại trong danh sách.")
    else:
        print("=> Không tìm thấy thiết bị.")
    
    # Ngoài ra, có thể dùng vòng lặp để đếm
    so_lan_tim_thay = 0
    for ten in danh_sach_server:
        if ten == ten_thiet_bi_can_tim:
            so_lan_tim_thay += 1
    

5.3.2. và List: Tạo Menu Tương tác

  • Kết hợp với để tạo một chương trình quản lý đơn giản:

    • Hiện menu: 1. Thêm, 2. Xóa, 3. Hiển thị, 4. Thoát.

    • Dùng để xử lý lựa chọn của người dùng.

    • Dùng hoặc để thao tác với List.