Python符号比较

2024-09-30 01:25:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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


Tags: 字符串示例数字字符endaastprint
3条回答

这看起来像是itertools.groupby的任务。在

from itertools import groupby
data = 'aaaabbсaa'
compressed = ''.join('{}{}'.format(key, len(list(group))) for key, group in groupby(data))
print(compressed)

结果

^{pr2}$

这可能有助于了解这里发生了什么。在

data = 'aaaabbсaa'
for key, group in groupby(data):
    print(key, len(list(group)))

结果

a 4
b 2
с 1
a 2

这样做有点傻,但是:

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)

示例

^{pr2}$

你的代码有三个问题。在

首先,正如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]对的iterable上循环来进一步改进这一点;这样就根本不需要索引了。使用^{}slicing这非常简单。也不需要对边缘进行特殊处理:

^{pr2}$

我认为Matthias's ^{} solution更像Python,也更简单(还有很多事情你可能会搞错,比如从cnt = 0开始),但这对于开箱即用的新手来说应该是可以理解的。(如果您不明白zip(st[1:]+" ", st),请尝试打印出st[1:]list(zip(st[1:], st))和{},这样应该会更清楚。)

相关问题 更多 >

    热门问题