我想定义一个函数,该函数在该字符串中包含一个字符串和一个字母,并输出一个新字符串,该字符串的出现次数为一次。例如
my_function("happy kitten","p")
'hapy kitten'
或
my_function("happykitten","t")
'happykiten'
我已经尝试了
def my_function(string, lett):
newString = ""
for char in string: #all characters
for s in string: #character I'm testing
if s == len(s) > 1:
newString+=lett # if there are multiple occurrences of s, replace with lett since its a single char anyway
else:
newString+=char #if not a duplicate, add next char to newString
return newString #("happy kitten","p") returns 'ppppppppppp'
和
def my_function(string, lett):
newString = ""
for char in string: #all characters
for s in string: #character I'm testing
if s == s+1:
newString+=lett # if there are multiple occurrences of s, replace with lett since its a single char anyway
else:
newString+=char #if not a duplicate, add next char to newString
return newString #TypeError: cannot concatenate 'str' and 'int' objects
我的职能出了什么问题?请不要导入或内置函数。
答案 0 :(得分:4)
如果您改变主意关于导入/内置函数,您可以随时执行此操作:
from itertools import groupby
def my_function(s, c):
return ''.join(c if a==c else ''.join(b) for a,b in groupby(s))
>>> from itertools import groupby
>>> def my_function(s, c):
... return ''.join(c if a==c else ''.join(b) for a,b in groupby(s))
...
>>> my_function("happy kitten","p")
'hapy kitten'
>>> my_function("happykitten","t")
'happykiten'
答案 1 :(得分:2)
迭代字符是低效的,很可能是错误的事情。听起来很像是一个新生课程的家庭作业。在现实生活中,你应该研究正则表达式,this question似乎提供了一个优雅的答案。
你的问题是你假设s + 1指向迭代器中的下一个值,这不是一个有效的假设。您需要做的是记录目击并相应地记录下一次迭代行为。
我们仍然可以在实践中解决这个问题:
def strip_duplicate_letters(input, letter):
output = ''
last = False
for c in input:
if c == letter:
if last:
continue
else:
last = True
else:
last = False
output += c
return output
这是一件非常重要的事情,你必须仔细考虑才能确保理解。然后忘记这个例子并重现自己。
另一种方法是枚举字母以使索引号可用:
for i, c in enumerate(input):
if i > 0 and c == letter and input[i-1] == letter:
continue
output += c
如果enumerate
问题太多,您可以使用整数作为计数器并递增它。
i = 0
for c in input:
....
i += 1
...