我有st = 'aaaabbсaa'
。我的任务是如果在字符串中重复字符,那么我必须写下字符加上一个计算重复的数字。
我的代码(但它不起作用):
st = "aaaabbcaa"
cnt = 0
cnt2 = 0
cnt3 = 0
j = len(st)
i = 0
while i < j:
if st[i] == st[i - 1]:
cnt += 1
print("a" + str(cnt), end="")
elif st[i] == st[i - 1]:
cnt2 += 1
print("b" + str(cnt2), end="")
elif st[i] == st[i - 1]:
cnt3 += 1
print("c" + str(cnt3), end="")
i += 1
示例输入1:aaaabbcaa
样本输出1:a4b2c1a2
样本输入2:abc
示例输出2:a1b1c1
答案 0 :(得分:4)
这看起来像itertools.groupby的任务。
from itertools import groupby
data = 'aaaabbсaa'
compressed = ''.join('{}{}'.format(key, len(list(group))) for key, group in groupby(data))
print(compressed)
结果
a4b2с1a2
这可能有助于了解这里发生的事情。
data = 'aaaabbсaa'
for key, group in groupby(data):
print(key, len(list(group)))
结果
a 4
b 2
с 1
a 2
答案 1 :(得分:1)
您的代码存在三个问题。
首先,正如gnibbler指出的那样,您的所有if
/ elif
条件都是相同的。而且你不需要为每个字母单独设置一个条件,你只需要打印变量(如st[i]
)而不是文字(如"a"
)。
其次,您尝试打印运行中每个字符的当前运行长度,而不是在整个运行之后。因此,如果您使用此功能,而不是a4b2c1a2
,那么您将获得a1a2a3a4b1b2c1a1a2
。您需要跟踪运行中每个字符的当前运行长度,但只有在到达不同的字符时才打印出来。
最后,您有两个一个一个错误。首先,当i
从0开始时,st[i - 1]
是st[-1]
,这是最后一个字符;你不想与之比较。其次,当i
最终到达j-1
时,您需要处理剩余的剩余运行。
因此,对代码的最小更改是:
st = "aaaabbcaa"
cnt = 0
j = len(st)
i = 0
while i < j:
if i == 0 or st[i] == st[i - 1]:
cnt += 1
else:
print(st[i - 1] + str(cnt), end="")
cnt = 1
i += 1
print(st[i - 1] + str(cnt))
作为旁注,一个非常简单的方法可以改善这一点:range(len(st))
为您提供从0开始但不包括len(st)
的所有数字,这样您就可以摆脱j
和手动i
循环,只需使用for i in range(len(st)):
。
但是你可以通过循环遍历st[i], st[i-1]
对的迭代来进一步改善这一点;然后你根本不需要索引。使用zip
和slicing非常简单。然后你不需要对边缘进行特殊处理:
st = "aaaabbcaa"
cnt = 1
for current, previous in zip(st[1:]+" ", st):
if current == previous:
cnt += 1
else:
print(previous + str(cnt), end="")
cnt = 1
我认为Matthias's groupby
solution更加pythonic,更简单(还有许多你可能会遇到的问题,比如从cnt = 0
开始),但这应该是最容易理解的开箱即用的新手。 (如果您不理解zip(st[1:]+" ", st)
,请尝试打印st[1:]
,list(zip(st[1:], st))
和list(zip(st[1:]+" ", st)
,并且应该更清楚。)
答案 2 :(得分:0)
这是一种愚蠢的方式,但是:
def encode(s):
_lastch = s[0]
out = []
count = 0
for ch in s:
if ch == _lastch:
count +=1
else:
out.append(_lastch + str(count))
_lastch = ch
count = 1
out.append(_lastch + str(count))
return ''.join(out)
实施例
>>> st = "aaaabbcaa"
>>> encode(st)
'a4b2c1a2'