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

Python 重复字符会导致错误的重复计数,python,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-

我的函数如下所示:

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'
如何修复此问题?

不要使用
str.index()
,它将返回第一个匹配项。由于
c
b
和a出现在字符串的早期,因此无论当前字母的位置如何,都会返回
2
1
0

请使用以下命令来代替位置计数器:

for i, letter in enumerate(s, 1):
    a.append(i * letter)
第二个参数是起始值;将此设置为1意味着您可以避免以后必须
+1
。查看是否需要有关
enumerate()
功能的更多详细信息

您可以在此处使用列表理解,而不是使用
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()
不要使用
str.index()
,它将返回第一个匹配项。由于
c
b
和a出现在字符串的早期,因此无论当前字母的位置如何,都会返回
2
1
0

请使用以下命令来代替位置计数器:

for i, letter in enumerate(s, 1):
    a.append(i * letter)
第二个参数是起始值;将此设置为1意味着您可以避免以后必须
+1
。查看是否需要有关
enumerate()
功能的更多详细信息

您可以在此处使用列表理解,而不是使用
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()

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

下面是一个Pythonic解决方案:

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

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

下面是一个Pythonic解决方案:

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

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

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

“预期输出不符合预期”?提示:当
i
s
中多次出现时,
s.index(i)
返回什么?“预期输出不符合预期”?提示:当
i
s
中多次出现时,
s.index(i)
返回什么?我不知道
枚举(\uu,开始\u索引)
。我不确定使用它是否比增加一个从零开始的索引更符合python。不过这绝对是一个很酷的解决方案。@orlp:为什么使用内置迭代器来添加索引计数器,从而消除了大量不必要的手动计数,会不那么像python一样呢?因为在我看来,在你写
c*i
的那一刻,
i
就不再是索引了。在这种情况下,字符数的公式是1+零基索引是相当巧合的,我认为通过编写
(I+1)
,强调这确实是一个公式并不是一件坏事。但我对这两种方式都不是很确定。注意:
join([i*c代表i,c在枚举(S,1)])
伤害了我的眼睛,那些多余的
[]
@orlp:
str.join()
需要一个列表;它会将任何其他内容转换为列表。这使得生成器表达式在这里变慢,所以我总是使用列表comp。这是个例外,否则我会同意裁员。请看,我没有意识到这一点,不管怎样,我不会用多余的括号来编写它,除非代码位于分析过的瓶颈中。但是我知道你是从哪里来的。我不知道
enumerate(\uu,start\u index)
。我不确定使用它是否比增加一个从零开始的索引更符合python。不过这绝对是一个很酷的解决方案。@orlp:为什么使用内置迭代器来添加索引计数器,从而消除了大量不必要的手动计数,会不那么像python一样呢?因为在我看来,在你写
c*i
的那一刻,
i
就不再是索引了。在这种情况下,字符数的公式是1+零基索引是相当巧合的,我认为通过编写
(I+1)
,强调这确实是一个公式并不是一件坏事。但我对这两种方式都不是很确定。注意:
join([i*c代表i,c在枚举(S,1)])
伤害了我的眼睛,那些多余的
[]
@orlp:
str.join()
需要一个列表;它会将任何其他内容转换为列表。这使得生成器表达式在这里变慢,所以我总是使用列表comp。这是个例外,否则我会同意裁员。请看,我没有意识到这一点,不管怎样,我不会用多余的括号来编写它,除非代码位于分析过的瓶颈中。但我知道你是从哪里来的。