30/09/2018, 16:43

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     
Gió viết 18:54 ngày 30/09/2018

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)
"""
Nguyễn Minh Dũng viết 18:50 ngày 30/09/2018

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

BaoLe viết 18:51 ngày 30/09/2018

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
Nguyễn Đức Minh viết 18:52 ngày 30/09/2018
  • Đề 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 , tên biến, tên hàm viết thường thôi, muốn rõ thì thêm dấu _
Bài liên quan
0