Python符号比较

时间:2014-11-19 21:06:12

标签: 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

3 个答案:

答案 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]对的迭代来进一步改善这一点;然后你根本不需要索引。使用zipslicing非常简单。然后你不需要对边缘进行特殊处理:

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'