Kết quả không khớp với điều kiện

hiện em đang code một chương trình có thể mã hóa huffman động sử dụng python. Nhưng hiện code của em gặp trục trặc trong điều kiện phần “for x in oldtree”.
Khi chạy chương trình, Ở terminal em đang có kết quả sau mã hóa:

Ky tu:
[0, ' ']
[0, ' ', 1]
[0, ' ', 1, 's']
[1, 's']
[0, ' ', 1, 's', 2]
[0, ' ', 1, 's', 2, 'i']
[0, ' ', 1, 's', 2, 'i', 'h']
[0, ' ', 1, 's', 2, 'i', 'h', 'T']
['h', 'T']
[0, ' ', 1, 's', 2, 'i', 'h', 'T', 2]
['h', 'T']
[0, ' ', 1, 's', 2, 'i', 'h', 'T', 2, 2]
[0, ' ', 1, 's', 'i', 'h', 'T', 2, 3, 3]

[0, ' ', 1, 's'] thỏa mãn điều kiện if len(newtree) % 2 == 0:block = newtree[len(newtree) - 2:] nên sẽ có kết quả block [1, 's'] ( trong block = [0, x] ) nhưng khi xét đến [0, ' ', 1, 's', 2, 'i'] thì dù nó thỏa mãn điều kiện đầu nhưng lại không trả về kết quả block là [2, 'i'] mà lại tiếp tục xét đến chữ cái tiếp theo là h và T. Mọi người xem giúp em đoạn này em lỗi ở đâu ạ

phần code:

text = 'This '

print(f"Text: {text}\n")
textArr = []
textNumber = []
numberArr = []
treeText = []
oldtree = []
newtree = []
#Change to ASCII function
def ascii(symbol):
    ASCII = format(ord(symbol), '08b')
    return ASCII
#Tree Fix Function
def nodeUpdate(block):
    blockValue = []
    for x in block:
        if isinstance(x, int):
            blockValue.append(x)
        else:
            blockValue.append(textNumber[textArr.index(x)])
    return sum(blockValue)
def sapXep(a):
    treeNumber = [x if isinstance(x, int) else textNumber[textArr.index(x)] for x in a ]
    sortedNumber = sorted(range(len(treeNumber)), key=lambda i: treeNumber[i])
    a = [a[i] for i in sortedNumber]
    b = []
    oldA = [a[i : i+2] for i in range(0, len(a), 2)]
    blk = a[:2]
    b.extend(blk)
    if oldtree:
        for item in oldA:
            if oldA.index(item) >= 1:
                for y in item:
                    if isinstance(y, str):
                        b.append(y)
                    else:
                        b.append(nodeUpdate(blk))
                blk.clear()
                blk += b[len(b) - 2: ]
    return b
#TreeDraw
for x in text:
    print(f"Ky tu: {x}")
    if x not in textArr:
        block = [0, x]
        textArr.append(x)
        textNumber.append(1)
        newtree.extend(block)
        for x in oldtree:
            if isinstance(x, str):
                newtree.append(x)
                if len(newtree) % 2 == 0:
                    block = newtree[len(newtree) - 2:]
            else:
                print(block)
                newtree.append(nodeUpdate(block))
                if len(newtree) % 2 == 0:
                    block = newtree[len(newtree) - 2:]
            print(newtree)
        newtree = sapXep(newtree)
        print(newtree)
        oldtree = list(newtree)
        newtree.clear()

    print(' ')

Dù bạn đã cố gắng miêu tả output cũng như đưa code đầy đủ. Nhưng còn thiếu một vài thứ cần thiết để mọi người có thế giúp bạn tốt hơn:

  • Output mong muốn của bạn là gì? Nó khác gì so với output của code trên?
  • Code của bạn logic chưa rõ ràng lắm, bạn có thể comment hoặc giải thích các dòng code nhằm để làm gì không? Mong muốn đầu vào/đầu ra của từng block là gì?
3 Likes

Bạn debug như này thì không ổn tẹo nào, debug print thì cũng thêm vào vài từ để biết print gì

print('newtree', newtree, 'x', x)
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?