我的功能如下:
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'
我该如何解决这个问题?
答案 0 :(得分:1)
不要使用str.index()
,它会返回第一场比赛。由于c
和b
和a出现在字符串的早期,无论当前的位置如何,您都会2
,1
和0
返回/ 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()