给定一个整数,我需要创建一个元组列表,以便在每个元组中,第一个条目是数字的数字,第二个条目是其频率。这应该从数字的左侧开始,并且数字的顺序很重要。例如11122311会导致[('1', 3), ('2', 2),('3',1),('1',2)].
我不想使用内置函数,例如groupby.
我试图迭代字符串的元素,只要它们相同,然后剪切这些数字并再次迭代,直到字符串列表的长度为零。不幸的是我无法成功地实现这一点。任何帮助表示赞赏。谢谢。
def compress(n):
L = []
while len(str(n)) != 0:
for i in range(len(str(n))):
for j in range(len(str(n))):
if str(n)[i] == str(n)[i+j]:
L.append((str(n)[i],j))
str(n) = str(n)[j:]
return L
print(compress(11122))
Run Code Online (Sandbox Code Playgroud)
您可以通过保留前一个字符并保留“游程”计数(即在它更改之前您看到了多少个字符)来创建一个简单的游程长度编码器。
def compress_rle(s):
compressed = []
if not s:
return compressed
previous_character = s[0]
run = 0
for character in s:
if character != previous_character:
compressed.append((previous_character, run))
run = 0
run += 1
previous_character = character
compressed.append((previous_character, run))
return compressed
print(compress_rle('11122311'))
Run Code Online (Sandbox Code Playgroud)
这输出与您在问题中给出的输出相同:
[('1', 3), ('2', 2), ('3', 1), ('1', 2)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |