Lỗi IndexError: list index out of range khi lấy phần tử thứ m+1 trong mảng

như hình file input ý tưởng của mình là cho dữ liệu của SinhVien, GiaoVien, svTKB, gvTKB, MonHoc vào các mảng tương ứng, sau đó cho chạy 3 dòng for cho mảng SinhVien, svTKB, MonHoc.Nếu có mã sv nào trong bảng sinh viên bằng với mã sv trong bảng svTKB và phần tử kế tiếp của phần tử trong svTKB bằng mã môn học trong mảng MônHọc thì tính số chỉ của sinh viên đó.Sau khi chạy thì in ra thông tin sinh viên như hình và thêm tổng số tín chỉ. Mình đã hoàn thành bài này bằng java

nhưng hiện mình đang học python và muốn code lại bài này bằng python và mình không thể lấy được phần tử thứ m+1 trong mảng và bi báo lỗi IndexError: list index out of range. Mong mọi người giúp đỡ.

Dòng

for l in range(len(listMH)-1):

đổi thành

for l in range(len(listMH)-2):

Mình nhớ là đã nói với bạn về dòng này rồi, nhưng bạn không chịu tư duy cẩn thận về nó.

Code bạn còn bị indent lỗi phần bên trong for n kia kìa.

P/s: Lần sau không được up screenshot code, hãy up code lên.

2 Likes

nó vẫn báo lỗi bạn ơi if listSVTKB[m+1] in listMH[l] and listMH[l+2] == 1:
IndexError: list index out of range

Sao listSVTKB lại lấy index của listSV? 2 list này liên quan gì đến nhau?

for m in range(len(listSV)-1):
    for n in range(len(listSVTKB)-1):
        ...
        if listSVTKB[m+1] ...: # thế m là index của listSVTKB hay listSV?
2 Likes

à lỗi mình r để mình sửa lại

if listSVTKB[n+1] in listMH[l+1] and listMH[l+2] == 3:
print(“pass”)
hiện tại test print thử ở trong dòng if này và vẫn chưa print ra được không biết là mình dùng “in” để so sanh có đúng hay không ạ

Các list của bạn là list 2 chiều hay list 1 chiều? Size như thế nào?

1 Like

[‘51003133’, ‘Duong Huu Phuc’, ‘M\n’, ‘0’, ‘51503116’, ‘Nguyen Hong Thuan’, ‘M\n’, ‘0’, ‘51503207’, ‘Duong Thi Trang’, ‘F\n’, ‘0’]
[‘51503116’, ‘504070\n’, ‘51503116’, ‘501045\n’, ‘51503207’, ‘504070\n’]
[‘504070’, ‘SOA’, ‘3\n’, ‘501045’, ‘DSA1’, ‘4’]
tương ứng là listSV, listSVTKB, listMH. mình không biết phải làm sau để mất dấu \n trong các phần tử.

Sửa thành

if listSVTKB[n+1] == listMH[l+1] and listMH[l+2] == 3:

Sau khi đọc string, đối với string đọc được thì gán qua 1 bước

s = s.rstrip('\n')

để làm mất dấu \n ở cuối đi.

1 Like

mình đã fix được dấu \n cuối dòng nhưng if listSVTKB[n+1] == listMH[l+1] and listMH[l+2] == 3: thì vẫn không chạy được bạn ạ

Cái này bạn không up code bằng chữ lên thì mình không biết tại sao lỗi đâu bạn. Bạn up code lên ideone, nhập input đàng hoàng tử tế rồi thả link mình xem nha.

1 Like

mình có thể kết pn fb vs pn để dễ trao đổi k

Mình không dùng facebook. Trao đổi lập trình thì bạn tiếp tục ở DNH này, tại sao phải vác nhau lên facebook?

1 Like

tại mình thấy fb dễ trao đổi hơn nếu pn thích ở đây thì vẫn ok.ĐÂY LÀ TOÀN BỘ CODE CỦA MÌNH

'''
Created on May 8, 2018

@author: root
'''
from Tranning_test1.SinhVien import SinhVien
from Tranning_test1.GiangVien import GiangVien
from Tranning_test1.MonHoc import MonHoc
from _overlapped import NULL
from filecmp import cmp

class Test():
    sv = SinhVien("51503105", "phat", "F",0,NULL)
    gv = GiangVien("23232323", "phat", "F",0,NULL)
    mh = MonHoc("15050303", "cc", 0)
    list = []
    with open("input2.txt", "r+") as f:
        for line in f:
            line1 = line.split(",")
#             print(line1)
            list.append(line1)
    list_0 = []
    list_0 = list.pop(0)
    d = list_0.pop(0)
    e = list_0.pop(0)
    f = list_0.pop(0)
    listSV = []
    listSVID = []
    listGV = []
    listGVID = []
    listSVTKB = []
    listGVTKB = []
    listMH = []
    for i in list:
        if 'SinhVien' in i[0]:
            q = i[0]
            w = q[9:18]
            r = i[2]
            t = r[0:1]
#             print(t)
            listSVID.append(w)
            listSV.append(w)
            listSV.append(i[1])
            listSV.append(t)
            listSV.append('0')
            if 'M' in i[2]:
                sv.gender = 'M'
            else:
                sv.gender = 'F'
#             print(listSV)
        if 'GiangVien' in i[0]:
            r = i[0]
            t = r[10:18]
            y = i[2]
            u = y[0:1]
            listGV.append(t)
            listGVID.append(t)
            listGV.append(i[1])
            listGV.append(u)
            listGV.append('0')
            if 'M' in i[2]:
                gv.gender = 'M'
            else:
                gv.gender = 'F'
#             print(listGV)
        if 'svTKB' in i[0]:
            y = i[0]
            u = y[6:18]
            o = i[1]
            p = o[0:5]
#             print(u)
            listSVTKB.append(u)
            listSVTKB.append(p)
#         print(listSVTKB)
        if 'gvTKB' in i[0]:
            o = i[0]
            p = o[6:18]
            a = i[1]
            s = a[0:5]
#             print(p)
            listGVTKB.append(p)
            listGVTKB.append(s)
#             print(listGVTKB)
        if 'MonHoc' in i[0]:
            g = i[0]
            h = g[7:18]
            a = i[2]
            s = a[0:1]
#             print(h)
            listMH.append(h)
            listMH.append(i[1])
            listMH.append(s)
#             print(listMH)
            mmh = h
            tmh = i[1]
#             print(tmh)
            tc =mh.getTinChi()
            if i[2] == 1:
                tc = 1
            if i[2] == 2:
                tc = 2
            if i[2] == 3:
                tc = 3
            if i[2] == 4:
                tc = 4
            if i[2] == 5:
                tc = 5
#     print(listGVTKB)
#     print(listGV)
#     print(listSV)
#     print(listSVTKB)
#     print(listMH)
#  --------------------------------------------------------------------------------------
    stcID = sv.getSoTinChiTichLuy()
    for m in range(len(listSV)-1):
        for n in range(len(listSVTKB)-1):
                for l in range(len(listMH)-2):
                    if listSV[m] == listSVTKB[n]:
                        print("đã vào")
#                         print(listSVTKB[n])
#                         print(listSVTKB[n+1])
#                         print(listMH[l])
#                         if listSVTKB[n+1] in listMH[l+1] and listMH[l+2] == 1:
#                             print("cc") 
#                             stcID = stcID + 1
#                             print(stcID)
#                             listSV.insert(n+3, stcID)
#                         if listSVTKB[n+1] in listMH[l+1] and listMH[l+2] == 2:
#                             print("cc")
#                             stcID = stcID + 2
#                             print(stcID)
#                             listSV.insert(n+3,stcID)
#                         print(listSV[m])
#                         print(listMH[l+2])
                        if listSVTKB[n+1] == listMH[l+1] and listMH[l+2] == 3:
                            print("pass")
#                             stcID = stcID + 3
#                             print(stcID)
                            listSV.insert(n+3,stcID)
                        if listMH[l+2] == 4:
                            print("cc")
                            stcID = stcID + 4
                            print(stcID)
                            stcID = stcID + 4
#                         if listSVTKB[n+1] in listMH[l+1] and listMH[l+2] == 5:
#                             print("cc")
#                             stcID = stcID + 5
#                             print(stcID)
#                             listSV.insert(n+3,stcID)
#         stcID = 0

#     print(listSV)

ĐÂY LÀ FILE INPUT

51503207,504070,1503013
SinhVien	51003133,Duong Huu Phuc,M
SinhVien	51503116,Nguyen Hong Thuan,M
SinhVien	51503207,Duong Thi Trang,F
GiangVien	1503013,John Smith,M
GiangVien	1701245,Archer Alexander,M
GiangVien	2331542,Jennifer Aniston,F
svTKB	51503116,504070
svTKB	51503116,501045
svTKB	51503207,504070
gvTKB	1503013,504070
gvTKB	2331542,501045
MonHoc	504070,SOA,3
MonHoc	501045,DSA1,4

Code này của bạn không đầy đủ, code lại toàn index m, n, l rất khó debug. Bạn chịu khó debug đi nhé.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?