重复字符会导致错误的重复计数

时间:2016-10-04 14:39:44

标签: python

我的功能如下:

def accum(s):
    a = []
    for i in s:
        b = s.index(i)
        a.append(i * (b+1))
    x = "-".join(a)
    return x.title()

预期输入:

'abcd'

输出应该是:

'A-Bb-Ccc-Dddd' 

但是如果输入有一个重复出现的字符:

'abccba'

它返回:

'A-Bb-Ccc-Ccc-Bb-A'

而不是:

'A-Bb-Ccc-Cccc-Bbbbb-Aaaaaa'

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

不要使用str.index(),它会返回第一场比赛。由于cb和a出现在字符串的早期,无论当前的位置如何,您都会210返回/ em>信。

使用enumerate() function代替位置计数器:

for i, letter in enumerate(s, 1):
    a.append(i * letter)

第二个参数是起始值;将此值设置为1意味着您可以避免以后+ 1。如果您需要有关enumerate()的详细信息,请参阅What does enumerate mean?

您可以在此处使用列表推导,而不是使用list.append()调用:

def accum(s):
    a = [i * letter for i, letter in enumerate(s, 1)]
    x = "-".join(a)
    return x.title()

这可能会在紧要关头变成单线:

def accum(s):
    a = '-'.join([i * c for i, c in enumerate(s, 1)]).title()

答案 1 :(得分:1)

这是因为s.index(a)返回角色的第一个索引。您可以使用enumerate将元素与其索引配对:

这是一个Pythonic解决方案:

def accum(s):
    return "-".join(c*(i+1) for i, c in enumerate(s)).title()

答案 2 :(得分:0)

simple:

def accum(s):
    a = []
    for i in range(len(s)):
        a.append(s[i]*(i+1))
    x = "-".join(a)
    return x.title()