Tư duy Tính toán

Lists, Tuples, Dictionaries

Trường ĐH Công nghệ – Đại học Quốc gia Hà Nội

Nội dung

  1. Động cơ & kịch bản đời thực
  2. List
  3. Tuple
  4. Dictionary
  5. So sánh ba cấu trúc
  6. Bài tập thực hành
  7. Thảo luận

1.
Động cơ & kịch bản đời thực

Động cơ & kịch bản đời thực

  • Vì sao cần cấu trúc dữ liệu?
  • Lưu & quản lý dữ liệu hiệu quả
  • VD: lớp sinh viên, kho sản phẩm, danh sách điểm

Động cơ & kịch bản đời thực

  • List → giống shopping list (có thứ tự)
  • Tuple → “gói” cố định (không đổi)
  • Dictionary → “sổ danh bạ” (cặp key: value)

Động cơ & kịch bản đời thực

Ví dụ: Quản lý sinh viên

  • list → nhiều mục
  • tuple → dữ liệu cố định
  • dict → thông tin gắn nhãn

student_names = ["An", "Bình", "Chi"]   # list
student_info = ("S001", "An", 3)        # tuple
student_profile = {                     # dict
    "id": "S001",
    "name": "An",
    "year": 3,
    "major": "CS"
}
          

Động cơ & kịch bản đời thực

  • List: playlist bài hát, hàng đợi công việc
  • Tuple: toạ độ GPS (latitude, longitude)
  • Dictionary: từ điển, dữ liệu JSON trong API

2.
Lists

List là gì?

  • Tập hợp có thứ tự, bao bởi [ ]
  • Phần tử có chỉ số (bắt đầu 0)
  • Có thể rỗng [] hoặc trộn kiểu (nên đồng nhất)

grades = [9.5, 8.0, 7.0, 10.0]
names = ["An", "Bình", "Chi"]
mixed = [1, "two", 3.0]
        

Vì sao List hữu ích?

  • Gộp dữ liệu liên quan (tên, điểm, nhiệm vụ)
  • Nhiều thao tác linh hoạt: thêm, xoá, sắp xếp, lặp
  • Nền tảng cho cấu trúc phức tạp (ma trận, tập dữ liệu)

List: thao tác cơ bản


>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
>>> nums + [60, 70]
[10, 20, 30, 40, 50, 60, 70]
>>> "two" in ["one", "two", "three"]
True
        

List: thao tác nâng cao


nums = [10, 20, 30, 40, 50]

# Cập nhật & thêm
nums[0] = 11             # cập nhật
nums.append(60)          # thêm cuối
nums.insert(2, 25)       # thêm tại chỉ số
nums.extend([70, 80])    # thêm nhiều phần tử

# Xoá & sắp xếp
nums.remove(30)             # xoá theo giá trị
popped = nums.pop()         # xoá cuối, trả về phần tử
popped_index = nums.pop(1)  # xoá theo chỉ số
nums.sort(reverse=True)     # sắp xếp giảm dần
nums.reverse()              # đảo ngược
        

Lưu ý

  • List là mutable (có thể thay đổi)
  • Phần tử có thể là bất kỳ kiểu dữ liệu nào, kể cả list khác (lồng nhau)
  • Thao tác trên list có thể ảnh hưởng trực tiếp đến dữ liệu gốc

Bài tập nhanh: List

Tạo list grades với các điểm số: 9.5, 8.0, 7.0, 10.0.

  1. In điểm đầu tiên và cuối cùng.
  2. Thêm điểm 9.0 vào cuối danh sách.
  3. Sắp xếp danh sách điểm theo thứ tự giảm dần.

3.
Tuples

Tuple là gì?

  • Tập hợp có thứ tự, bất biến
  • Bao bởi ( ); có thể trộn kiểu
  • Không đổi sau khi tạo

point = (21.0278, 105.8342)   # (latitude, longitude)
rgb = (255, 200, 0)
info = ("An", 20, "CS")
        

Vì sao dùng Tuple?

  • Dữ liệu cố định kích thước, không muốn bị sửa
  • Thường dùng để trả về nhiều giá trị từ hàm

def stats(xs):
    total = sum(xs)
    avg = total / len(xs)
    return (total, avg)  # trả về tuple (tổng, trung bình)
        

Tuple vs. List

Tuple List
Cú pháp ( ) [ ]
Thay đổi Immutable (không đổi) Mutable (có thể đổi)
Kích thước Cố định Thay đổi
Ứng dụng Dữ liệu cố định Dữ liệu linh hoạt
Ví dụ (1, 2, 3) [1, 2, 3]

Tuple: thao tác & gán


t = (3, 4, 5)
print(t[0])        # truy cập phần tử
print(t[1:3])      # cắt (slicing)
print(len(t))      # độ dài
print(4 in t)      # kiểm tra thành phần
        

Không thể thay đổi phần tử (immutable):


t = (3, 4, 5)
t[0] = 10    # lỗi: TypeError
        

Gán nhiều biến từ Tuple


point = (3, 4)
x, y = point
print(x, y)
        

Hữu ích khi hàm trả về nhiều giá trị:


def stats(xs):
    total = sum(xs)
    avg = total / len(xs)
    return (total, avg)  # trả về tuple (tổng, trung bình)
s, a = stats([10, 20, 30])
print(s, a)
        

Enumerate


names = ["An", "Bình", "Chi"]
for index, name in enumerate(names):
    print(index, name)
        

Output:


0 An
1 Bình
2 Chi
        

Bài tập nhanh: Tuple

  1. Tạo tuple point = (3, 4) và truy cập các phần tử.
  2. Chuyển list [1, 2, 3] thành tuple bằng hàm tuple().
  3. Viết hàm trả về (tổng, trung bình) của một list.

4.
Dictionaries

Dictionary là gì?

Tập hợp không có thứ tự các cặp key: value; mỗi key là duy nhất.

  • Cú pháp: {key: value, ...}
  • Tương tự “tra từ điển” hoặc “danh bạ”

profile = {"name": "An", "major": "CS", "year": 3}
score = {"An": 9.0, "Bình": 8.5}
        

Vì sao dùng Dictionary?

  • Gán nhãn dữ liệu bằng tên có nghĩa
  • Tra cứu nhanh theo key
  • Phù hợp dữ liệu có cấu trúc/cặp

Tạo & truy cập

  • Key phải là kiểu dữ liệu hashable (ví dụ: str, int, tuple)

>>> d = {"id": "S001", "name": "An", "grade": 9.2}
>>> print(d["name"])             # truy cập bằng key
An
>>> d["grade"] = 9.5             # cập nhật giá trị
>>> d["year"] = 3                # thêm key mới
>>> print(d)
{'id': 'S001', 'name': 'An', 'grade': 9.5, 'year': 3}
>>> d["age"]                     # key không tồn tại?
KeyError: 'age'
        

Dictionary: thao tác cơ bản


d = {}
d["x"] = 1           # gán key mới → tự động tạo
d["x"] = d["x"] + 2  # cập nhật
d.update({"y": 5})
exists = "x" in d
deleted = d.pop("y", None)  # xoá nếu có
keys = list(d.keys())
items = list(d.items())
        

Dictionary lồng nhau


students = {
    "S001": {"name": "An", "scores": [9.0, 8.5]},
    "S002": {"name": "Bình", "scores": [7.5, 8.0]},
}
print(students["S001"]["scores"][0])   # 9.0
        

Dictionary như bộ tích luỹ

Ví dụ: đếm tần suất ký tự trong chuỗi bằng dict


text = "abba!"
count = {}
for ch in text:
    count[ch] = count.get(ch, 0) + 1
print(count)   # {'a': 2, 'b': 2, '!': 1}
        

Lặp với Dictionary


d = {"An": 9.0, "Bình": 8.5, "Chi": 8.8}
for name in d:                 # mặc định lặp qua key
    print(name, d[name])

for k, v in d.items():         # lặp qua (key, value)
    print(k, v)
        

Dict không phải sequence → không có chỉ số số nguyên.

Bài tập nhanh: Dictionary

  1. Tạo dictionary profile = {'name': 'An', 'major': 'CS'}; thêm mục 'year': 3.
  2. In từng cặp key - value trong dictionary.
  3. Viết hàm đếm tần suất từ trong một câu.

5.
So sánh List, Tuple, Dictionary

List Tuple Dictionary
Cú pháp [ ] ( ) {key: value}
Giữ thứ tự? ✅ Có ✅ Có ⚠️ Có (theo thứ tự chèn, từ Python 3.7)
Mutable? ✅ Có ❌ Không ✅ Có
Truy cập Chỉ số (index) Chỉ số (index) Khoá (key)
Trùng lặp? ✅ Có ✅ Có ❌ Khoá phải duy nhất
Dùng khi? Tập dữ liệu kích thước thay đổi, nên đồng nhất Bản ghi nhóm, kích thước cố định Ánh xạ key → value (bảng tra cứu)
Ví dụ [1, 2, 3] (1, 2, 3) {'a': 1, 'b': 2}

6.
Thực hành

Thực hành: List

Tạo chương trình lưu & phân tích điểm sinh viên.


grades = [9.0, 8.5, 7.5, 10.0, 9.5]
print("Điểm trung bình:", sum(grades) / len(grades))
grades.append(8.0)
grades.sort(reverse=True)
print("Danh sách điểm (giảm dần):", grades)
        

Câu hỏi: Nếu dùng grades[5] = 6.5 thì sẽ xảy ra điều gì?

Thực hành: Tuple


hanoi = (21.0278, 105.8342)
print("Kinh độ Hà Nội:", hanoi[0])
print("Vĩ độ Hà Nội:", hanoi[1])
        
  1. Thêm tuple biển diễn toạ độ của một thành phố khác, ví dụ TP. HCM
  2. In cả hai toạ độ mà chỉ dùng một câu lệnh print

Câu hỏi: Tại sao sử dụng tuple cho toạ độ thay vì list?

Thực hành: Dictionary


students = {
    "S001": {"name": "An", "score": 9.0},
    "S002": {"name": "Bình", "score": 8.5},
}

for sid, info in students.items():
    print(sid, info["name"], info["score"])
        

Câu hỏi: In điểm trung bình của tất cả sinh viên.

Thử thách tích hợp

Dự án nhỏ: “Quản lý dữ liệu lớp học”

Viết chương trình quản lý dữ liệu lớp học:

  1. Dùng list chứa các dict để lưu thông tin sinh viên
  2. Cho phép người dùng:
    • Thêm sinh viên mới
    • Tìm kiếm theo mã sinh viên
    • Hiển thị tất cả điểm số

7.
Thảo luận

Liên hệ Tư duy Tính toán

Mỗi cấu trúc dữ liệu liên quan đến các khía cạnh của Tư duy Tính toán:

  • Phân rã: tách dữ liệu thành phần nhỏ
  • Nhận dạng mẫu: dùng list/tuple cho phần tử tương tự
  • Trừu tượng hóa: mô hình hoá dữ liệu thực (dict)
  • Thiết kế thuật toán: chọn cấu trúc phù hợp để tính toán hiệu quả

Lỗi thường gặp

  • Nhầm mutable vs. immutable
  • Dùng list khi cần tra cứu theo từ khoá (nên dùng dict)
  • Lẫn lộn giữa ( )[ ]

Tổng kết

  1. List: có thứ tự, thay đổi được
  2. Tuple: có thứ tự, không đổi
  3. Dictionary: ánh xạ key→value, tra cứu nhanh
  4. Chọn đúng cấu trúc ⇒ thuật toán hiệu quả hơn