Hai danh sách phải khớp vị trí
Tạo tệp `diem_ca_nhom.py` với dữ liệu hư cấu: `ten = ["An", "Bình", "Chi"]`, `tat_ca_diem = [[8, 7], [9, 8, 7], [6, 10]]`. Tên ở vị trí `i` ứng với dãy điểm ở vị trí `i`; nhóm Bình có ba đầu điểm, hai nhóm còn lại có hai. Vì độ dài các hàng **khác nhau**, đây là danh sách chứa danh sách, không gọi là ma trận chữ nhật m × n. Nhiệm vụ là in trung bình từng người, tên có trung bình cao nhất và điểm thấp nhất của cả nhóm.
Duyệt từng người rồi từng điểm
```python
ten = ["An", "Bình", "Chi"]
tat_ca_diem = [[8, 7], [9, 8, 7], [6, 10]]
if len(ten) != len(tat_ca_diem) or not ten:
raise ValueError("Tên và dãy điểm phải khớp, không rỗng")
if any(not hang for hang in tat_ca_diem):
raise ValueError("Mỗi người cần ít nhất một điểm")
trung_binh = []
diem_thap_nhat = tat_ca_diem[0][0]
for i in range(len(ten)):
hang = tat_ca_diem[i]
trung_binh.append(sum(hang) / len(hang))
for x in hang:
if x < diem_thap_nhat:
diem_thap_nhat = x
cao_nhat = max(trung_binh)
nguoi_cao_nhat = [ten[i] for i in range(len(ten)) if trung_binh[i] == cao_nhat]
print(trung_binh, nguoi_cao_nhat, diem_thap_nhat)
```
Kết quả là `[7.5, 8.0, 8.0] ['Bình', 'Chi'] 6`. Mỗi hàng được chia cho **số điểm của chính hàng ấy**, nên Bình chia 24 cho 3 và Chi chia 16 cho 2. Hai người cùng đạt trung bình cao nhất được giữ cả hai, thay vì âm thầm chỉ chọn người xuất hiện đầu. Điểm thấp nhất 6 được tìm khi duyệt mọi hàng. Nếu tên và số hàng không bằng nhau hoặc có hàng rỗng, chương trình báo lỗi trước khi thống kê; với điểm thực, còn cần kiểm từng giá trị thuộc khoảng 0–10.
Bài luyện
Vì sao không dùng `len(tat_ca_diem)` làm mẫu số cho mọi người?
Trong ví dụ có ba người nhưng mỗi người có hai hoặc ba điểm.
len dùng được cho danh sách.
len(tat_ca_diem)=3.
Trung bình cần chia cho số đầu điểm.
Lời giải
Mỗi hàng chứa điểm của một người. Trung bình của người đó bằng sum(hang)/len(hang), không chia cho số hàng của cả nhóm.
Bài luyện
Theo dữ liệu ví dụ, những ai có trung bình cao nhất?
An có trung bình 7.5.
Bình đạt 8.0 nhưng Chi cũng đạt 8.0.
Cả hai cùng bằng mức cao nhất 8.0.
An thấp hơn 8.0.
Lời giải
Bình: (9+8+7)/3=8.0; Chi: (6+10)/2=8.0. Cả hai đạt trung bình cao nhất.
Bài luyện
Nếu có tên ở ba vị trí nhưng chỉ có hai hàng điểm, chương trình xử lí thế nào?
Không nên tự tạo điểm chưa được nhập.
Bước kiểm đầu phát hiện số tên khác số hàng.
Không có quy tắc bỏ tên.
Ba là số tên, không phải số điểm.
Lời giải
Tên ở vị trí i phải có hàng điểm ở cùng vị trí i. Nếu hai danh sách dài khác nhau, chương trình báo lỗi trước khi truy cập.
Đang học