Hai dãy đi theo từng dòng
Mỗi dòng `SeaGames.inp` bắt đầu bằng mã, sau đó là ít nhất ba điểm cách nhau bằng khoảng trắng. Có thể có số giám khảo khác nhau giữa các dòng. Mô-đun đọc trả `ma` và `bang_diem` sao cho `ma[i]` đi cùng `bang_diem[i]`. Chẳng hạn dòng `003 6.6 7.0 8.1` thành mã `"003"` và dãy `[6.6, 7.0, 8.1]`. Với tệp văn bản, số điểm phải chuyển từ chữ sang `float`; mã vẫn là chuỗi.
Kiểm từng dòng trước khi thêm dữ liệu
```python
def doc_diem(ten_tep):
ma, bang_diem = [], []
with open(ten_tep, encoding="utf-8") as f:
for so_dong, dong in enumerate(f, 1):
truong = dong.split()
if len(truong) < 4:
raise ValueError(f"Dòng {so_dong}: cần mã và ít nhất 3 điểm")
diem = [float(x) for x in truong[1:]]
if any(not 0 <= x <= 10 for x in diem):
raise ValueError(f"Dòng {so_dong}: điểm ngoài thang 0–10")
ma.append(truong[0])
bang_diem.append(diem)
return ma, bang_diem
ma, bang_diem = doc_diem("SeaGames.inp")
print(ma, bang_diem)
```
Nếu tệp chứa `003 6.6 7.0 8.1`, kết quả là `['003'] [[6.6, 7.0, 8.1]]`. `with` đóng tệp sau khi đọc. Dòng rỗng, thiếu điểm, chữ không đổi được thành số hoặc điểm ngoài thang đề bài đều làm chương trình báo lỗi; kiểm xong mới thêm vào hai dãy để chúng không lệch vị trí.
Bài luyện
Dòng `003 6.6 7.0 8.1` phải cho cặp dữ liệu nào?
Mã 003 bị mất số 0 đầu.
Mã là chuỗi, điểm được đổi thành số.
Điểm cần đổi thành số để tính.
Cần cả mã và mọi điểm.
Lời giải
Phần đầu là mã giữ nguyên "003"; ba phần còn lại đổi bằng float.
Bài luyện
Vì sao mỗi dòng hợp lệ phải có ít nhất bốn trường?
Đề yêu cầu hơn hai giám khảo.
Chỉ có một mã trên mỗi dòng.
Số điểm có thể lớn hơn ba.
Số trường không phải số dòng.
Lời giải
Một trường mã cộng ít nhất ba trường điểm là ít nhất bốn trường.
Bài luyện
Với dòng `045 9.0 8.5`, hàm `doc_diem` làm gì?
Chỉ hai điểm, trái yêu cầu.
Hàm không tự tạo điểm.
Có ba trường, ít hơn bốn.
Mô-đun đọc không ghi đầu ra.
Lời giải
Dòng có mã và hai điểm, tức ba trường; điều kiện len(truong)<4 báo lỗi.
Đang học