簡體   English   中英

符號的游程長度編碼

[英]Run Length encoding of symbols

我正在嘗試使用python編寫游程編碼代碼。如果消息包含長符號序列。 我打算將其編碼為符號列表以及符號出現的次數。這是我的代碼

alphabets = ['a','b','c','d','e','f','g','h','i','j','k',
             'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
char_count = 0
translate = ''

words = input('Enter your word:  ')

for char in words:
    if char in alphabets:
        char_count += 1
        translate += char + str(char_count)

print(translate)

當我運行程序時,這就是我得到的。

Enter your word:  abbbbaaabbaaa
a1b2b3b4b5a6a7a8b9b10a11a12a13

輸出實際上是預期的。

a1b4a3b2a3

有沒有辦法解決這個問題?

您可以簡單地使用正則表達式來解決問題:

import re
translate = re.sub(r"((.)\2*)", lambda x: x.group(2) + str(len(x.group(1))), words)

此正則表達式在words字符串中找到所有相似的連續符號組,並用其長度編碼替換它們。

一種可能的方法是使用itertools.groupby

from itertools import groupby
''.join([f'{letter}{len(list(grouper))}' for letter, grouper in groupby(words)])

說明

itertools.groupby將字符串拆分為相同字母的塊,將每個塊轉換為對(letter, grouper)然后返回生成這些對的對象:

>>> groupby('abbbbaaabbaaa')
<itertools.groupby at 0x6fffeafa098>

>>> for chunk in groupby('abbbbaaabbaaa'):
        print(chunk)
('a', <itertools._grouper object at 0x6fffeaf2cf8>)
('b', <itertools._grouper object at 0x6fffeae9908>)
('a', <itertools._grouper object at 0x6fffeae9898>)
('b', <itertools._grouper object at 0x6fffeaf2320>)
('a', <itertools._grouper object at 0x6fffeae9898>)

每個itertools._grouper對象還是一個生成器,它生成相應塊中的所有字母。 通過將其轉換為list ,我們可以檢查其長度並將其附加到結果中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM