Sắp bản ghi thay vì sắp riêng từng dãy
Bài luyện tập yêu cầu `ketqua.out` ghi vận động viên theo **điểm tổng hợp giảm dần**. Nếu chỉ sắp dãy điểm, mã sẽ gắn nhầm với người khác. Hãy ghép mỗi vận động viên thành một bản ghi `(mã, dãy điểm gốc, điểm tổng hợp)`, rồi sắp các bản ghi theo trường điểm. Với dữ liệu SGK, thứ tự là `200 9.14`, `901 9.06`, `045 8.71`, `101 7.77`, `003 7.08`. Khi bằng điểm, cách sắp dưới đây giữ thứ tự xuất hiện ban đầu; đề bài không quy định cách phá hòa.
Một phép sắp cho cả ba trường
```python
def sap_ket_qua(ma, bang_diem, ket_qua):
if len(ma) != len(bang_diem) or len(ma) != len(ket_qua):
raise ValueError("Ba dãy phải cùng độ dài")
ban_ghi = list(zip(ma, bang_diem, ket_qua))
ban_ghi.sort(key=lambda hang: hang[2], reverse=True)
return ban_ghi
ma = ["101", "200", "003"]
bang_diem = [[8, 9, 7], [9, 9, 9], [7, 7, 7]]
ket_qua = [7.8, 9.0, 7.0]
for ma_so, diem_goc, diem_chung in sap_ket_qua(ma, bang_diem, ket_qua):
print(ma_so, f"{diem_chung:.2f}")
```
Kết quả là ba dòng `200 9.00`, `101 7.80`, `003 7.00`. Để ghép vào chương trình bài trước, sau bước tính gọi `sap_ket_qua`; rồi ghi mã và điểm tổng hợp từ từng bản ghi đã sắp. Bản ghi vẫn chứa `diem_goc` để có thể đối chiếu, dù tệp đầu ra của nhiệm vụ này chỉ cần mã và điểm tổng hợp.
Bài luyện
Vì sao không sắp riêng dãy `ket_qua`?
Ba trường của một người phải đi cùng nhau.
Python sắp được số thực.
Không bỏ vận động viên.
Đề yêu cầu giảm.
Lời giải
Nếu chỉ đổi thứ tự điểm tổng hợp, vị trí tương ứng trong dãy mã không đổi và kết quả bị gắn nhầm.
Bài luyện
Với điểm `[7.8, 9.0, 7.0]` ứng với mã `["101","200","003"]`, mã nào lên đầu?
7.8 thấp hơn 9.0.
9.0 là điểm lớn nhất.
7.0 thấp nhất.
Các điểm không bằng nhau.
Lời giải
Sắp giảm theo điểm cho 9.0 lên đầu, ứng với mã 200.
Bài luyện
Khi hai vận động viên bằng điểm, mã của cách sắp trong ví dụ giữ thứ tự nào?
Cách sắp Python này ổn định với khóa bằng nhau.
Mã không là khóa.
Mã không là khóa.
Không có bước xóa.
Lời giải
Python sort ổn định, nên hai bản ghi cùng điểm giữ thứ tự ban đầu; mã không tham gia phá hòa.
Đang học