Saturday, November 23, 2024

[Python] Lesson 16 – Sets

-

Trong Python, set là một kiểu dữ liệu được sử dụng để lưu trữ tập hợp các phần tử không có thứ tự, không trùng lặp và không thể thay đổi. Set được định nghĩa bởi cặp dấu ngoặc nhọn {} và các phần tử được phân tách bằng dấu phẩy.

Ví dụ:

# Tạo một set chứa các số nguyên không trùng lặp
my_set = {1, 2, 3, 4, 5, 5, 6, 6}

# In ra set, các phần tử không bị trùng lặp và không có thứ tự
print(my_set)  # Output: {1, 2, 3, 4, 5, 6}

# Tạo một set chứa các chuỗi
my_set = {"apple", "banana", "orange"}

# In ra set
print(my_set)  # Output: {'apple', 'banana', 'orange'}

Như trong ví dụ trên, set được sử dụng để lưu trữ tập hợp các phần tử không có thứ tự, không trùng lặp và không thể thay đổi. Set có thể chứa các loại dữ liệu khác nhau, nhưng tất cả các phần tử trong một set phải là không thể thay đổi (immutable), vì vậy bạn không thể sử dụng một list hoặc một set khác như một phần tử trong một set.

Một ví dụ thực tế về sets trong Python là khi bạn muốn loại bỏ các giá trị trùng lặp từ một danh sách hoặc chuỗi. Bạn có thể chuyển danh sách hoặc chuỗi đó thành một set bằng cách sử dụng hàm set(), sau đó chuyển nó lại thành danh sách hoặc chuỗi (nếu cần).

Ví dụ, bạn có một danh sách các số nguyên và muốn loại bỏ các giá trị trùng lặp. Bạn có thể sử dụng sets để làm điều này như sau:

lst = [1, 2, 3, 2, 4, 1, 5]
unique_lst = list(set(lst))
print(unique_lst)

Kết quả sẽ là [1, 2, 3, 4, 5], loại bỏ các giá trị trùng lặp trong danh sách lst.

Ví dụ tổng hợp trong thực tế.

Đoạn code sau đây là một hàm Python có tên create_role_service, có nhiệm vụ thêm các vai trò mới vào cơ sở dữ liệu.

def create_role_service(results):
    success_msgs = []
    existing_roles = Roles.query.all()

    for result in results:
        role_id = result['name'].lower().replace(" ", "_")
        role_name = result['name']
        role_description = result['description']

        existing_role = next((p for p in existing_roles if p.id == role_id), None)

        if not existing_role:
            newRecord = Roles(id=role_id, name=role_name, description=role_description)
            db.session.add(newRecord)
            success_msgs.append(f"Role '{role_name}' was successfully added.")
        else:
            success_msgs.append(f"Role '{role_name}' already exists.")

    db.session.commit()

    unique_success_msgs = list(set(success_msgs))
    response = jsonify(unique_success_msgs)

    if any("already exists" in msg for msg in unique_success_msgs):
        return make_response(response, 409)
    else:
        return make_response(response, 200)

Dưới đây là giải thích chi tiết về cách hàm này hoạt động:

Khởi tạo Biến và Truy vấn Cơ sở dữ liệu:

success_msgs = []
existing_roles = Roles.query.all()
  • success_msgs: Một danh sách để lưu trữ các thông báo thành công hoặc lỗi cho từng vai trò.
  • existing_roles: Lấy tất cả các bản ghi từ bảng Roles trong cơ sở dữ liệu.
for result in results:
    role_id = result['name'].lower().replace(" ", "_")
    role_name = result['name']
    role_description = result['description']
  • Lặp qua danh sách results, mỗi phần tử của results chứa thông tin về một vai trò mới.
  • Tạo role_id bằng cách chuyển đổi tên vai trò thành chữ thường và thay thế khoảng trắng bằng dấu gạch dưới.
existing_role = next((p for p in existing_roles if p.id == role_id), None)

Kiểm tra xem vai trò có sẵn trong existing_roles không.

if not existing_role:
    newRecord = Roles(id=role_id, name=role_name, description=role_description)
    db.session.add(newRecord)
    success_msgs.append(f"Role '{role_name}' was successfully added.")
else:
    success_msgs.append(f"Role '{role_name}' already exists.")
  • Nếu vai trò chưa tồn tại, tạo một bản ghi mới trong bảng Roles và thêm vào cơ sở dữ liệu.
  • Nếu vai trò đã tồn tại, thêm thông báo lỗi vào danh sách success_msgs.
db.session.commit()
unique_success_msgs = list(set(success_msgs))
response = jsonify(unique_success_msgs)
  • Commit các thay đổi vào cơ sở dữ liệu.
  • Loại bỏ các thông báo trùng lặp từ danh sách success_msgs và chuyển thành danh sách unique_success_msgs.
  • Tạo một đối tượng JSON từ danh sách unique_success_msgs.
Giải thích thêm về tác dụng tính năng sets:

Dòng unique_success_msgs = list(set(success_msgs)) có tác dụng loại bỏ các phần tử trùng lặp khỏi danh sách success_msgs và lưu kết quả vào biến unique_success_msgs.

set(success_msgs): Chuyển danh sách success_msgs thành một tập hợp (set). Một tập hợp trong Python không chứa các phần tử trùng lặp, và nó là một cấu trúc dữ liệu không có thứ tự.

list(...): Chuyển tập hợp thành danh sách. Kết quả là một danh sách chứa duy nhất các giá trị duy nhất từ success_msgs.

unique_success_msgs = ...: Gán danh sách mới (chứa các giá trị duy nhất) vào biến unique_success_msgs.

Kết quả là unique_success_msgs sẽ là một danh sách không có các phần tử trùng lặp từ success_msgs. Điều này thường được sử dụng khi bạn muốn duy trì chỉ các giá trị duy nhất từ một danh sách và loại bỏ các trùng lặp.
if any("already exists" in msg for msg in unique_success_msgs):
    return make_response(response, 409)
else:
    return make_response(response, 200)
  • Kiểm tra xem có bất kỳ thông báo lỗi nào trong unique_success_msgs chứa chuỗi “already exists” không.
  • Nếu có, trả về một phản hồi lỗi (HTTP 409 – Conflict).
  • Ngược lại, trả về một phản hồi thành công (HTTP 200 – OK).

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories