Lỗi khi dùng hàm trong Python

Mình viết chương trình để đếm số lần xuất hiện của mỗi phần tử và lưu lại trong 1 list.

def DemSoPhanTu(SoNguyen):
    Dem = []
    for i in range(0, len(SoNguyen)):
        dem = 0
        for j in range(i + 1, len(SoNguyen)):
            if SoNguyen[i] == SoNguyen[j]:
                dem = dem + 1
                del(SoNguyen[j])
        Dem.append(dem)
    return Dem

A = [1, 3, 5, 7, 12,1 ,3 ,12 ,100 ,20 ,100 ,5]
B = DemSoPhanTu(A)
for i in B:
    print i,

Nhưng khi chạy lại gặp lỗi sau:

Traceback(most recent call last):
File "ex8.py", line 13, in <module>
B = DemSoPhanTu(A)
File "ex8.py", line 6, in DemSoPhanTu
if SoNguyen[i] == SoNguyen[j]:
IndexError: list index out of range     
2 Likes

Khi del 1 phần tử thì len(SoNguyen) thay đổi, trong khi range(...,len(SoNguyen)) không cập nhật sau mỗi lần del. Tốt nhất là dùng 1 mảng đánh dấu những phần tử đã đếm trước đó.

def DemSoPhanTu(SoNguyen):
    Dem = []
    mark=[False] *len(SoNguyen)
    for i in xrange(0, len(SoNguyen)):
        dem = 1
        
        if mark[i] :continue
               
        for j in xrange(i + 1, len(SoNguyen)):
            if SoNguyen[i] == SoNguyen[j]:
                dem = dem + 1
                mark[j]=True
        Dem.append((SoNguyen[i],dem))
    return Dem

A = [1, 3, 5, 7, 12,1 ,3 ,12 ,100 ,20 ,100 ,5]
B = DemSoPhanTu(A)
for i in B:
    print i,
"""
(1, 2) (3, 2) (5, 2) (7, 1) (12, 2) (100, 2) (20, 1)
"""
3 Likes

I moved a post to a new topic: Lỗi Attributeerror: ‘nonetype’ object has no attribute ‘group’

Thế này có ổn không @Gio?

def TinhSoLanXuatHienCuaMoiSo(SoNguyen):
	Tam = []
	i = 0
	SoPhanTu = len(SoNguyen)
	while i < SoPhanTu:
		dem = SoNguyen.count(SoNguyen[i])
		Tam.append((SoNguyen[i],dem))
		j = i + 1
		while j < SoPhanTu:
			if SoNguyen[i] == SoNguyen[j]:
				del SoNguyen[j] 
				SoPhanTu = SoPhanTu - 1
			j = j + 1
		i = i + 1
	return Tam

A = [2,5,6,3,2,3,6,5,8,9,10]
B = TinhSoLanXuatHienCuaMoiSo(A)
for i in B:
	print i
1 Like
  • Đề nghị bác @14520054 khi lập trình Python là mới hay đã một thời gian rồi thì hãy cố gắng tập thói quen viết code theo chuẩn PEP8 nhá, đấy là style tối thiểu của dân Python rồi, không thì nhìn code sẽ rất đau mắt.
  • Bài của bạn tuy ngắn nhưng đã khá là đau mắt rồi :grinning: , tên biến, tên hàm viết thường thôi, muốn rõ thì thêm dấu _
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?