我有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
这看起来像是itertools.groupby的任务。在
结果
^{pr2}$这可能有助于了解这里发生了什么。在
结果
这样做有点傻,但是:
示例
^{pr2}$你的代码有三个问题。在
首先,正如gnibbler指出的,所有的
if
/elif
条件都是相同的。不需要为每个字母单独设置条件,只需打印变量(如st[i]
),而不是文本(如"a"
)。在第二,您尝试打印出运行中每个字符的当前运行长度,而不是在整个运行之后。所以,如果你让这个工作,而不是
a4b2c1a2
,你将得到a1a2a3a4b1b2c1a1a2
。您需要跟踪运行中每个字符的当前游程长度,但只有在遇到不同的字符时才将其打印出来。在最后,你有两个一个错误。首先,当
i
从0开始时,st[i - 1]
是st[-1]
,这是最后一个字符;您不想与它进行比较。第二,当i
最后到达j-1
时,您就有了一个需要处理的剩余运行。在因此,对代码的最小更改是:
作为补充说明,有一个非常简单的改进方法:
range(len(st))
提供了从0到len(st)
的所有数字,因此您可以摆脱j
和手册i
循环,只使用for i in range(len(st)):
。在但是,您可以通过在} 和slicing这非常简单。也不需要对边缘进行特殊处理:
^{pr2}$st[i], st[i-1]
对的iterable上循环来进一步改进这一点;这样就根本不需要索引了。使用^{我认为Matthias's ^{} solution 更像Python,也更简单(还有很多事情你可能会搞错,比如从},这样应该会更清楚。)
cnt = 0
开始),但这对于开箱即用的新手来说应该是可以理解的。(如果您不明白zip(st[1:]+" ", st)
,请尝试打印出st[1:]
、list(zip(st[1:], st))
和{相关问题 更多 >
编程相关推荐