输入:
abbbbccdddaaabbbbeeff
输出:
ab4c2d3a3b4e2f2
我尝试过如下操作
string = 'abbbbccccd'
strList = list(string)
sum = 0
for i , s in enumerate(string):
# print (strList[i],strList[i+1])
if strList[i] == strList[i+1]:
sum = sum + 1
print(strList[i],'****',sum )
else:
sum = sum + 1
print(strList[i],'****',sum )
sum = 0
但是无法打印列表中的最后一个元素。
在不使用任何内置函数的情况下,还有其他更好的方法吗?
编辑:我想了解打印abb4c2的逻辑。这就是为什么我提到没有任何内置函数的原因。如果逻辑可以理解,则可以使用内置函数。
答案 0 :(得分:6)
在这些问题中,请始终保持当前状态(当前字符和当前计数)。无需索引,逻辑更简单。
最后,不要忘记“刷新”当前循环数据,否则您会错过最后一次迭代。
我的建议:
s = "abbbbccdddaaabbbbeeff"
result = []
current = None
current_count = 0
for c in s:
if current == c:
current_count += 1
else:
if current_count > 1:
result.append(str(current_count))
current_count = 1
current = c
result.append(c)
# don't forget last iteration count
if current_count > 1:
result.append(str(current_count))
print("".join(result))
打印:
ab4c2d3a3b4e2f2
好的,我知道"".join(result)
会调用一个内置函数,但这是最有效的方法。您不想一个接一个地追加字符来从列表中创建字符串。
一旦证明您掌握了这些算法,就可以使用itertools.groupby
之类的内置函数来完成这些工作。它更快且没有错误(甚至更好:this other answer)
答案 1 :(得分:2)
您可以使用more_itertools
:
from more_itertools import run_length
s = "abbbbccdddaaabbbbeeff"
result = ""
for char, num in run_length.encode(s):
result += f"{char}{num if num != 1 else ''}"
print(result) #returns ab4c2d3a3b4e2f2
编辑:缺少有关内置功能的部分。这使用一个外部库。留在这里是因为我发现最初的问题非常有趣。
答案 2 :(得分:0)
您可以使用词典
a='abbbbccdddaaabbbbeeff'
d=dict()
for i in a:
if i not in d:d[i]=1
else:d[i]+=1
for key,value in d.items():
print(key,value,sep='',end='')
输出a4b8c2d3e2f2