[toc:ul]
Tham khảo đoạn chương trình sau:
def nhapTuTep():
fi = open("../bangDiem.txt", encoding ='utf-8')
dong = fi.readline().split() # đọc dòng thứ nhất
n = int (dong[0])
m = int (dong[1])
dong = fi.readline().split() #đọc dòng thứ hai có các tên môn học
for i in range(1,m+1):
tenMon.append(dong[i])
for i in range(n): #đọc n dòng tiếp theo
dong = fi.readline().split()
ten = dong.pop(0) # lấy tên HS
tenHS.append(ten) # đưa vào danh sách tenHS
diem = [float(d) for d in dong]
a.append(diem) # nối phần còn lại là điểm của HS
# thành một hàng của a
fi.close()
return (n,m)
Tham khảo đoạn chương trình sau:
def tachMon(ds,chiso): # ds: mảng hai chiều các điểm môn học
ten = tenMon[chiso] # chiso: môn học thứ k
kq1, kq2 = [], [] # kq1: danh sách điểm môn học
# kq2: danh sách các cặp (tên HS, điểm)
for i in range(soHS):
kq1.append(ds[i][chiso]) # nối thêm điểm của HS thứ i
kq2.append([tenHS[i],ds[i][chiso]]) # nối thêm tên của HS
# thứ i và điểm tương ứng
return (ten, kq1, kq2)
Đáp án 1. Kế thừa từ Bài 9
def phandoanLomuto_tuple_down(a, lo, hi):
i = (lo-1)
pivot = a[hi][1] # thành phần 1 là điểm môn học
for i in range(lo, hi):
if a[j][1] >= pivot: # giảm dần theo điểm môn học
i = i+1
a[i], a[j] = a[j], a[i]
a[i+1], a[hi] = a[hi], a[i+1]
return (i+1)
def quickSort_tuple_down(a, lo, hi):
if len(a) == 1:
return a
if lo < hi:
p = phandoanLomuto_tuple_down(a, lo, hi)
quickSort_tuple_down(a,lo,p-1)
quickSort_tuple_down(a,p+1,hi)
Đáp án 2: Cải biên thuật toán sắp xếp khác, ví dụ thuật toán sắp xếp chèn
def sxChen_tuple_down(a): # chèn tuyến tính, a là danh sách các bộ
n = len(a)
for i in range(1,n):
val = a[i][1] # thành phần 1 là điểm môn học
dsCon = a[i]
j=i
i=i+1
# dịch dần từng bước, tìm vị trí để chèn
while (j>0) and (a[j-1][1] > val):
a[j] = a[j-1]
j = j-1
a[j] = dsCon